Introduction
Biodiversity, which is measured as an attribute by two components: richness and evenness, is vital to maintaining the functioning of ecosystems. Richness, by definition, is expressed as the number of species. In plant communities, it is measured because high richness is related to healthy ecosystem: increased stability, productivity and resistance to disturbances[1]. Monitoring the species richness, dominance and composition is of critical importance to determine how plant community is affected by environmental factors. Global climate changes significantly affect precipitation and temperature[2]. As a consequence, increased temperature and precipitation fluctuations will result in composition and richness changes. In general, species richness tend to increase with temperature increasing. Richness will increase to a maximum until water deficits where it will begin to depress[3]. Increased precipitation also benefits species richness by improving soil nutrient availability and increasing metabolism[4].Human activities such as mowing, grazing and fertilization will cause land degradation and soil erosion, and consequently degraded the vegetation cover[5]. In this study, we analyzed two monitored temperate grassland communities in the northern Rocky Mountains of Montana, USA, within Yellowstone National Park and the National Bison Range. Vegetation richness is estimated as the number of species encountered across all transects. Yellowstone National Park(YNP)is located at Montana’s southern border, which is mountainous and highly touristic. The northern boundary area is dominated by native grass and shrub communities. The National Bison Range(NBR) is located in Montana’s western boundary. Both are dominated by native bunchgrasses, including Pseudoroegneria spicata (Pursh) A. Love, Festuca idahoensis Elmer, and F.altaica Trin, and both of YNP and NBR have experienced climate change, grazing, and non-native species invasion. The grasslands are unique because they exist in cool, semi-arid northern landscapes that have not been highly affected by human activities, and have been resampled in the past 50 years. In 1957, YNP personnel constructed various five-acre exclosures in the northern winter range that eliminated hunting of large animals. Several transects were set up inside each exclosure. Outside the exclosures, a few transects were built and open to big-game hunting. NBR also established a experiment to investigate the effects of managed grazing. The transects were in areas where bisons are restricted to the refuge. Vegetation hits include either overstory or understory in the canopy. Substrate were recorded as bare ground, rock, pavement, litter or moss/lichen[6]. Our questions include the following: (i)Does the vegetation richness of the grassland community change over time and transects? (ii)The correlation between the environmental factors: baresoil, rock, litter, fall precipitation, maximum spring temperature. (iii)The linear regression model of relationship between predictor vegetation richness and explanatory variables. We will conduct a series of statistical analysis to answer these questions. First, we will perform a two-way ANOVA to explore the time and transect effects on vegetation richness. Second, we will calculate the correlation between the variables to detect the issue of collinearity. Multiple linear regression is then applied. We will fit the model with fixed effects and mixed effects. Two approaches: Likelihood-ratio test and AIC will be implemented to select model and parameters. Model averaging will be carried on plausible models. Finally, the selected model will be validated and compared with the mean to see the importance of the model.
Method
Data collection and variables
The transects were numerically oded with number 1-12, and have been sampled using exactly the same methods. Along each transect line, vegetation or substrate encountered at 0.33m mark was recorded. Vegetation hits include either overstory or understory in the canopy. Substrate were recorded as bare ground, rock, and litter[7]. The climate of both YNR and NBR is semi-arid. The specific temperature and precipitation values were collected from the nearest monitoring site using a SOGS(surface obserbation gridding system) with adjustment according to the transect’s elevation, slope, aspect and location on the landscape. The climate variables include mean maximum temperature for Spring(SprTmax), and total precipitation for Fall(FallPrec). There are 64 rows of data and 9 columns as variables which are SAMPLEYR, Time, Transect, Richness, ROCK, LITTER, BARESOIL, FallPrec, SprTmax.
Data cleaning
Almost any data analysis requires data cleaning. It is the process of identifying erroneous, incorrectly formatted, duplicate or incomplete data, removing them from the dataset, merging the data, and preparing the data for modeling[8]. In our vegetation dataset, we remove the incomplete rows by removing the rows contained NA. There are 58 rows of data left.
Data exploration
When we access the data, the first step is to visualize the data and investigate the data outliers, normality, linear and non-linear relationship between variables, ask questions such as where are the data centered, how are they spread, and whether data transformation is required[9].
Boxplot
Boxplot, or box-and-whisker plot, visualizes the mean and spread of a dataset based on five-number summary: the minimum, the maximum, the sample median, and the first and third quartiles. From boxplot, we can tell whether the data is symmetrical and how tightly it is grouped. Boxplot can also be used to analyze relationship between variables. In this case, we draw a boxplot of vegetation richness and boxplots of vegetation richness conditional on the nominal variables: transect and time respectively.
Dot plot
Dot plots represent each individual observation in a group data points based on a nominal variable[10]. It is a useful tool for identification of outliers and homogeneity. The x axis label shows the range of values, and y axis represents the identity of the data points.The package of interest is ggplot2.
Scatterplot
Scatterplot is a useful tool to visually explore the relationship between two variables by plotting one predictor variable along the horizontal axis and the response along the vertical axis. To help visualize the relationship, a regression line is often added to the plot.
Pairplot
Pairplot, or scatterplot matrix, shows multiple pair-wise scatterplots in one graph and can be used to analyze relationships between variables, and between variables and response. The pairplot of explanatory variables can be used to detect collinearity. The pairplot of all response and explanatory variables can be used for judging whether the relationships between response and predictors are linear. We used the R base function pairs().
Correlation
Correlation, or dependence, refers to the degree to which a pair of variables are linearly related. Positive correlation indicates that variables increase or decrease together, while negative correlation indicates that with one variable increasing, the other decreases, and vice versa. When predictor variables are highly correlated, they cannot independently predict the response, resulting in collinearity. However, the thresholds of correlation coefficients |r|<0.7 is an indicator. If |r| <0.7, collinearity will not be a big concern in regression analysis[11]. We use R package corrplot to visualize the correlation and RColorBrewer package to manage colors.
Balanced/Imbalanced Data
In mixed effect model, if there is very high difference between the numbers of observations in groups, then we can say our dataset is imbalanced. The group with more observations is overpresented, and there is a chance that they can outweigh others and vice versa for underrepresented groups. Having a balanced data set for a model would generate higher accuracy models. We use barplots to plot the amount of data in the different time groups and transects.
Two-way ANOVA
A two-way ANOVA is used to estimate how the mean of a quantitative variable changes according to the levels of two categorical variables. It examines the influence of two different categorical independent variables on one continuous dependent variable. The two-way ANOVA model is usually represented as: \[\mu _{{ij}}=\mu +\alpha _{i}+\beta _{j}+\gamma _{{ij}}\] However, since there is no replication within each group, we can still test the two main effects, but cannot test the interaction. We did the two-way ANOVA based on the assumption that there is no interaction. Then the model is represented as: \[\mu _{{ij}}=\mu +\alpha _{i}+\beta _{j}\] The two main effects in this case are time and transect. We used aov function to do the ANOVA test.
Multiple Linear Regression with Generalized Least Squares
There are typically multiple variables influence vegetation richness. We can describe the relationship by an intercept (\(\beta _{0}\)) and a regression coefficients (\(\beta _{1}\), \(\beta _{2}\), . . . , \(\beta _{m}\)): \[y_{i} = \beta_{0} + \beta_{1}x_{1i} + \beta_{2}x_{2i} +\beta_{3}x_{3i}+\beta_{4}x_{4i}+\beta_{5}x_{5i}+\epsilon_{i}\] With parameters:\(\beta_{0}\):Intercept, \(\beta_{1}\):Rock, \(\beta_{2}\):Litter, \(\beta_{3}\):Baresoil, \(\beta_{4}\): Fall precipitation, \(\beta_{5}\): Maximum Spring Temperature. We installed the R package nlme(Linear and Nonlinear Mixed Effects Models) and used the function gls(), fitting linear model using Generalized Least Squares, the default method is restricted maximum likelihood(REML).
Genearalized Least Squares
In Ordinary Least Squares Model, we minimize the sum of squared residuals(SSR): \[SSR = e^{T}e\\=(Y-X\hat{\beta})^{T}(Y-X\hat{\beta})\]
\[\hat{\beta}=argmin_{\hat{\beta}}SSR\] \[\hat{\beta}=(X^{T}X)^{-1}X^{T}Y\] However, there are a set of mathematical restrictions under which the ordinary least squared(OLS) estimator is the Best Linear Unbiased Estimator (BLUE). Genearl least squares(GLS) is more efficient than OLS under heteroscedasticity or autocorrelation.[12] To recover the BLUE estimator, the GLS approach is to transform the model to a new set of observations that satisfy the constant variance assumption, and then use OLS. Given the covariance matrix expressed as: \[Var(\epsilon)=\sigma^2V\] V is a \[n\times n\] matrix. We can define: \[V=K^{T}K=KK\] \[e'=K^{-1}e\\Y'=K^{-1}Y\\X'=K^{-1}X\] \[ SSR=e'^{T}e'\\=(Y'-X'\hat{\beta})^{T}(Y'-X'\hat{\beta})\] \[\hat{\beta_{GLS}}=argmin_{\hat{\beta_{GLS}}}SSR\] \[\hat{\beta_{GLS}}=(X^TV^{-1}X)^{-1}X^TV^{-1}Y\]
Paramter Interaction
In complex systems sucn as plant community, variables often interact with each other to influence outcomes.The grassland ecosystem response varies due to interaction of changes in both temperature and precipitation. Previous research found that bunchgrass productivity in National Bison Range increased with growing season precipitation, while warming weather alone has no significant effect[13]. We add an interaction term of fall precipitation(FallPrec) and maximum spring temperature(SprTmax): \[y_{i} = \beta_{0} + \beta_{1}x_{1i} + \beta_{2}x_{2i} + \beta_{3}x_{3i}+\beta_{4}x_{4i}+\beta_{5}x_{5i}+\beta_{6}x_{4i}x_{5i}+\epsilon_{i}\] \(\beta_{6}\) is the parameter of precipitation and temperature interaction term.
Time Effect
The species richness is not only affected by environmental factors, but also by time indirectly changing biotic and abotic conditions[14]. Time series analysis which is applied to data continuous through time, cannot be used on our dataset. We plotted the standardized residuals versus time to determine whether the linear regression model explains the temporal pattern. A LOESS smoother was added to assist visualization.
Linear Mixed Effects Model
Nested data often generated in multiple field sites. From the previous boxplot and time effects analysis, the data shows a nested structure: observations belong to nests or subgroups within a population. The subgroups here are different transects. Linear mixed effects model is a linear model that incorporates fixed and random effects. Random effects refer to parameters that are assumed to randomly varying around a population mean. Fixed effects do not vary. The mixed effects model can be expressed as: \[y=X\beta+Z\mathbf{b}+\epsilon\] \(y\) is the matrix of observation; \(X\) is a matrix of ‘fixed’ predictor variables; \(\beta\) is a vector of fixed effects; \(Z\) is a matrix of random predictor variables; \(\mathbf{b}\)is a vector of random effects; \(\epsilon\)is the distribution of errors. \[\mathbf{b}_{i}\sim\mathcal{N}(0,G_{i})\] \[\epsilon\sim\mathcal{N}(0,\sigma_{i})\] Tianyu et al.2020 proposed the following options when investigating the relationship between NDVI(Normalized Difference of Vegetation Index) and meteorological variables(precipitation and temperature)[15]. 1. Random intercept only 2. Random intercept and random slope of precipitation 3. Random intercept and random slope of temperature 4. Random intercept and random slope of both precipitation and temperature Here in our case, we fit the random intercept only model, and random intercept and slope of fall precipitation model using lme() (Linear Mixed-Effects Models)function in nlme package.
Identify the fixed effects structure
Result
Data Visualization





From the boxplots, the median richness is around 10, and there is no outlier. Conditional boxplots of richness versus time and transect show that vegetation richness differs by time and transect.

Scatterplots suggest that there are no obvious linear relationships between richness and each of the variables except for maximum spring temperature.


From pairplots and correlation matrix, there are weak linear relationships between variables(\(R^2\) is less than 0.6607), suggesting the correlations between them are not significant. There is no concern of collinearity with including these variables in a model apart from adding model complexity.
Balanced Data


From the barplots of the amount of data in the different groups for time and transects, we can see that the sampling is unbalanced, and the unbalance is presented seriously in time 6, sample year 1989, since the data includes more N/As in that year.
Two-way ANOVA
Df Sum Sq Mean Sq F value Pr(>F)
Time 1 0.2 0.21 0.03 0.863
Transect 1 141.1 141.15 19.77 4.28e-05 ***
Residuals 55 392.6 7.14
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Two-way analysis of variance result table suggests that transect effect statistically differs from 0. We can reject the NULL hypothesis and confirm that changing transects impact the vegetation richness. However, the p-value of Time is 0.863>>0.05, we cannot reject the NULL hypothesis, thus time does not have significant effect on vegetation richness.
Multiple Linear Regression
We fit the regression model with variables of rock, litter, baresoil, fall precipitation and maximum spring temperature.
Loading required package: carData
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 methods overwritten by 'car':
method from
influence.merMod lme4
cooks.distance.influence.merMod lme4
dfbeta.influence.merMod lme4
dfbetas.influence.merMod lme4


20 55
18 51

The coefficients are as following: Intercept:20.00064911, ROCK:-0.09267586, LITTER:-0.08263297, BARESOIL:-0.13366318, FallPrec:0.01964915 SprTmax: -0.40820573. There is no obvious pattern of residuals vs fitted value, and histogram and Q-Q plot suggest the residuals are normally distributed. Then we add the interaction term of maximum spring temperature and fall precipitation to our linear model:


20 55
18 51

fitted objects with different fixed effects. REML comparisons are not meaningful.
The coefficients are as following: Intercept: 17.511876003, ROCK: -0.093770749, LITTER:-0.087366303, BARESOIL:-0.135343390, FallPrec: 0.074229945, SprTmax:-0.198637807, FallPrec:SprTmax:-0.004438857. The residual plot does not show patterns and the residuals are normally distributed. Comparing the AIC of the two fixed model, we found that lr model with AIC=278.7057, is better than lr1 model with AIC=288.6994. likelihood ratio test(LR=7.993671, p-value=0.0047) also confirms the conclusion. In order to find out whether time has effect on our linear model, we plot residuals vs time:

A LOESS smoother with a span of 0.75 added to the diagram is almost a straight line at zero indicating that time is not important in the linear regression, which is consistent with ANOVA conclusion.
Linear Mixed Effects Model
The variable assumed to have random effects is Transect. mod1 is the random intercept model, and mod2 is the random intercept and slope model. Random intercept model(mod1):
Linear mixed-effects model fit by REML
Data: vege
Random effects:
Formula: ~1 | Transect
(Intercept) Residual
StdDev: 8.655913e-05 1.967092
Fixed effects: Richness ~ ROCK + LITTER + BARESOIL + FallPrec + SprTmax
Correlation:
(Intr) ROCK LITTER BARESO FllPrc
ROCK -0.399
LITTER -0.413 0.678
BARESOIL 0.097 0.180 0.300
FallPrec -0.396 -0.019 0.040 -0.205
SprTmax -0.689 -0.192 -0.301 -0.499 0.250
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.93664424 -0.60378566 -0.01930898 0.48097818 2.77216444
Number of Observations: 58
Number of Groups: 8


3 7
18 51

Random intercept and slope model(mod2):
Linear mixed-effects model fit by REML
Data: vege
Random effects:
Formula: ~1 + FallPrec | Transect
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 1.164790e-04 (Intr)
FallPrec 4.097639e-12 0
Residual 1.967092e+00
Fixed effects: Richness ~ ROCK + LITTER + BARESOIL + FallPrec + SprTmax
Correlation:
(Intr) ROCK LITTER BARESO FllPrc
ROCK -0.399
LITTER -0.413 0.678
BARESOIL 0.097 0.180 0.300
FallPrec -0.396 -0.019 0.040 -0.205
SprTmax -0.689 -0.192 -0.301 -0.499 0.250
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.93664424 -0.60378566 -0.01930898 0.48097818 2.77216443
Number of Observations: 58
Number of Groups: 8


3 7
18 51

Residuals of both mod1 and mod2 are normally distributed, but AIC of mod1 is lower than AIC of mod2(280.7057<284.7057), suggesting mod1 is better than mod2.
Identify the fixed effects structure
Model selection by likelihood ratio test:
By checking the AIC, lr is better than mod1. Based on p-values of the parameters, LITTER might be worth dropping.
Generalized least squares fit by REML
Model: Richness ~ ROCK + LITTER + BARESOIL + FallPrec + SprTmax
Data: vege
Coefficients:
Correlation:
(Intr) ROCK LITTER BARESO FllPrc
ROCK -0.399
LITTER -0.413 0.678
BARESOIL 0.097 0.180 0.300
FallPrec -0.396 -0.019 0.040 -0.205
SprTmax -0.689 -0.192 -0.301 -0.499 0.250
Standardized residuals:
Min Q1 Med Q3 Max
-1.93664425 -0.60378566 -0.01930898 0.48097818 2.77216444
Residual standard error: 1.967092
Degrees of freedom: 58 total; 52 residual
Step1: Dropping LITTER
Generalized least squares fit by REML
Model: Richness ~ ROCK + BARESOIL + FallPrec + SprTmax
Data: vege
Coefficients:
Correlation:
(Intr) ROCK BARESO FllPrc
ROCK -0.178
BARESOIL 0.255 -0.034
FallPrec -0.417 -0.062 -0.228
SprTmax -0.936 0.018 -0.450 0.275
Standardized residuals:
Min Q1 Med Q3 Max
-2.18554584 -0.65668433 0.02869008 0.46747717 2.91682985
Residual standard error: 2.020988
Degrees of freedom: 58 total; 53 residual
fitted objects with different fixed effects. REML comparisons are not meaningful.
We compared the two model(lr and refit1) via ANOVA, and the AIC result suggests that refit1 is better than lr, since AIC of refit1 is 276.0499, and AIC of lr is 278.7057, but the likelihood ratio of refit1 vs lr is 0.6558114, with p-value=0.418<0.05, indicating there is no significant difference. Looking at p-values of parameters in refit1, the next term might be worth dropping is FallPrec. Step2: Dropping FallPrec
Generalized least squares fit by REML
Model: Richness ~ ROCK + BARESOIL + SprTmax
Data: vege
Coefficients:
Correlation:
(Intr) ROCK BARESO
ROCK -0.225
BARESOIL 0.180 -0.049
SprTmax -0.940 0.036 -0.413
Standardized residuals:
Min Q1 Med Q3 Max
-1.97781710 -0.65999860 0.02218103 0.49718657 2.83075907
Residual standard error: 2.142215
Degrees of freedom: 58 total; 54 residual
fitted objects with different fixed effects. REML comparisons are not meaningful.
The AIC result suggests refit2 model(AIC=276.0499) is better than refit1(273.3391), but the likelihood ratio test indicates we cannot reject the NULL hypothesis and the two models do not differ significantly. #### Model selection by AICc:
AICc based model selection performed by dredge() function favors the fixed linear model with explanatory variales of BARESOIL, ROCK, SprTmax. Then we performed a final round of diagnostic checks to ensure there are no remaining issues by plotting the residuals and calculating the correlations.


Error in qqPlot(resid(refit2)) : could not find function "qqPlot"
The correlation between intercept and SprTmax is high. The solution is mean centering the variables:
Error in gls(Richness ~ RC + BS + ST, method = "ML", data = vege) :
could not find function "gls"
Model Average
There is only the top model left. 95% confidence interval of estimate parameters is: Intercept: (9.414, 10.517), Rock: (-1.533, -0.420), Baresoil: (-1.773, -0.550), SprTmax:(-1.835, -0.614)
Importance of the Model
We refitted the data with an intercept only model(refit4). The anova table of the selected models(refit2, lr) and refitting model(refit4) is shown below:
The AIC decreased by 24 and 18.635, and likelihood ratio is 30(p-value<0.0001) and 28.63 respectively. Our models significantly improves the prediction comparing to the mean.
Discussion
Vegetation richness is a measurement of biodiversity in a plant community. Environmental changes such as climate variation, baresoil changes, soil texture and rock composition over time all relate to vegetation richness. The transects are located in different study areas: Yellowstone National Park and National Bison Range. The YNP transects are located within lower teriary igneous and metamorphic rocks and transects in NBR are within fine-grained quartzitr, argillite, banded slate, and inter-bedded sandstone. The soil texture, rock and litter differ from each transect, resulting in different water retention and surface temperature.
In our study, we investigated effects of five variables: rock, litter, baresoil, maximum spring temperature, and fall precipitation. We fitted a multiple linear regression model to the data using the above variables.The coefficients suggest that vegetation richness is negatively related to litter(-0.0826), rock(-0.0927), baresoil(-0.1337) and maximum spring temperature(-0.4082), but it is positively related to fall precipitation(0.0196). Although time should play an important role in community changes, it has little effect on the linear model since on the residuals vs time plot, a LOESS smoother added was almost a straight line at zero, indicating time is not a concern in the regression model.
From previous studies, temperature and precipitation interact with each other and have effect on the productivity and biodiversity of an ecosystem. We added an interaction term of fall precipitation and maximum spring temperature to our model. The AIC of model with interaction is 288.6994, which is higher than AIC of model without interaction(278.7057). The likelihood ratio is 7.9937, p-value is 0.0047, which indicates that the extra interaction parameter did not result in an improvement to the model, but added extra complexity.
Linear mixed effects model is a statistical model containing both fixed effects and random effects. The assumption behind the model is that the effect of the variable occurring in nests varies randomly. Usually the mixed model explains the variation of errors better than models only with fixed effects. We refitted the model with a random intercept around data from the same transect, and with a random intercept and slope. However, comparing the three models, AIC of the fixed model is the lowest.
In the fixed effects selection process, we first looked at the p-values of the parameters in the full fixed effects model. The parameter of litter has the highest p-value(0.0523) might be worth dropping. The reduced model without litter has AIC value of 276.0499, lower than AIC of the full model(278.7057). However, the likelihood ratio is 0.6558, with p-value of 0.418, suggesting no significant difference between two models. Then by checking the p-values of the refitted model, the fall precipitation term with highest p-value(0.0077) might be worth dropping. The reduced model without litter and precipitation has AIC value of 273.3391, which is lower then the previous reduced model, but the likelihood ratio p-value is 0.3992 suggesting no significant difference. Likelihood ratio tests both indicate the terms do not need to be removed. The dredge() function shows that the clear winner is a fixed linear model with explanatory variables of BARESOIL, ROCK, SprTmax.
In the model validation process, we plotted the residuals and there is no obvious pattern between fitted values vs residuals. The residuals are normally distributed from the histograms and Q-Q plot. However, the correlation between intercept and SprTmax is high. We solved this problem by mean centering the variables.
We selected and averaged the models, by subsetting all models within \(\Delta\)AICc of 2 of the top model.There is only the top model(refit2)left. Then we refitted the data with an intercept only model(refit4). By including the factors of baresoil, rock, maximum spring temperature, the AIC decreased by 24, and likelihood ratio is 30(p-value<0.0001). By including the all the factors, the AIC decreased by 18.635, and likelihood ratio is 28.63(p-value<0.0001). Our model significantly improves the prediction comparing to the mean.
Two different model selection approaches: Likelihood ratio test and AIC provide two different models: 1. a fixed model of full factors: baresoil, maximum spring temperature, fall precipitation, rock and litter 2. a fixed model with reduced factors: baresoil, maximum spring temperature, rock. They both improve the model prediction compared to the mean. However, fall precipitation is vital to recharging soil moisture for plant growth to begin in spring; The amount of litter affect moisture retention, surface temperature, and nutrients available. Although AIC method favors the reduced model, we recommend the full model with all the variables in a biological context: biodiversity measured by vegetation richness, is negatively related to litter, rock, baresoil and maximum spring temperature, and positively related to fall precipitation. Highest coefficient of maximum spring temperature(-0.4082) indicates greater relevance of vegetation richness. Lower coefficients of fall precipitation and litter, indicate less relevance and might be dropped, which is consistent with AIC model selection result.
Reference
[1] Roberts, F. S. (2019). Measurement of biodiversity: Richness and evenness. In Mathematics of Planet Earth (pp. 203-224). Springer, Cham.
[2] Woodward, A., Smith, K. R., Campbell-Lendrum, D., Chadee, D. D., Honda, Y., Liu, Q., … & Haines, A. (2014). Climate change and health: on the latest IPCC report. The Lancet, 383(9924), 1185-1189.
[3] Gillman, L. N., & Wright, S. D. (2014). Species richness and evolutionary speed: the influence of temperature, water and area. Journal of Biogeography, 41(1), 39-51.
[4] Li, L., Zheng, Z., Biederman, J. A., Xu, C., Xu, Z., Che, R., … & Hao, Y. (2019). Ecological responses to heavy rainfall depend on seasonal timing and multi‐year recurrence. New Phytologist, 223(2), 647-660.
[5] Socher, S. A., Prati, D., Boch, S., Müller, J., Klaus, V. H., Hölzel, N., & Fischer, M. (2012). Direct and productivity‐mediated indirect effects of fertilization, mowing and grazing on grassland species richness. Journal of Ecology, 100(6), 1391-1399.
[6][7][14] Sikkink, P. G., Zuur, A. F., Ieno, E. N., & Smith, G. M. (2007). Monitoring for change: using generalised least squares, non-metric multidimensional scaling, and the Mantel test on western Montana grasslands. In Analysing ecological data (pp. 463-484). Springer, New York, NY
[8] Buttrey, S., & Whitaker, L. R. (2017). A Data Scientist’s Guide to Acquiring, Cleaning and Managing Data in R. Wiley.
[9] Zuur, A., Ieno, E. N., & Smith, G. M. (2007). Analyzing ecological data. Springer.
[10] Wilkinson, L. (1999). Dot plots. The American Statistician, 53(3), 276-281.
[11] Adler, P. B., & Levine, J. M. (2007). Contrasting relationships between precipitation and species richness in space and time. Oikos, 116(2), 221-232.
[12] Aitkin, A. C. (1935). On least squares and linear combination of observations. Proceedings of the Royal Society of Edinburgh, 55, 42-48.
[13] Volenec, Z. M., & Belovsky, G. E. (2018). The interaction of temperature and precipitation determines productivity and diversity in a bunchgrass prairie ecosystem. Oecologia, 188(3), 913-920.
[15] Li, T., Meng, Q., & Du, Q. (2020). Application of Random Effects to Explore the Gulf of Mexico Coastal Forest Dynamics in Relation to Meteorological Factors. IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing, 13, 5526-5535.
[16] Iacobucci, D., Schneider, M. J., Popovich, D. L., & Bakamitsos, G. A. (2016). Mean centering helps alleviate “micro” but not “macro” multicollinearity. Behavior research methods, 48(4), 1308-1317.
LS0tCnRpdGxlOiAiVXNpbmcgRml4ZWQgYW5kIE1peGVkIEVmZmVjdHMgTGluZWFyIFJlZ3Jlc3Npb24gYW5kIE1vZGVsIFNlbGVjdGlvbiBvbiBWZWdldGF0aW9uIFJpY2huZXNzIG9mIE1vbnRhbmEgR3Jhc3NsYW5kIgphdXRob3I6IHwgCiAgfCBZaXJhbyBaaGFuZwogIHwgVW5pdmVyc2l0eSBvZiBCcml0aXNoIENvbHVtYmlhCmRhdGU6IDIyLzAyLzIwMjEKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMgSW50cm9kdWN0aW9uCgpCaW9kaXZlcnNpdHksIHdoaWNoIGlzIG1lYXN1cmVkIGFzIGFuIGF0dHJpYnV0ZSBieSB0d28gY29tcG9uZW50czogcmljaG5lc3MgYW5kIGV2ZW5uZXNzLCBpcyB2aXRhbCB0byBtYWludGFpbmluZyB0aGUgZnVuY3Rpb25pbmcgb2YgZWNvc3lzdGVtcy4gUmljaG5lc3MsIGJ5IGRlZmluaXRpb24sIGlzIGV4cHJlc3NlZCBhcyB0aGUgbnVtYmVyIG9mIHNwZWNpZXMuIEluIHBsYW50IGNvbW11bml0aWVzLCBpdCBpcyBtZWFzdXJlZCBiZWNhdXNlIGhpZ2ggcmljaG5lc3MgaXMgcmVsYXRlZCB0byBoZWFsdGh5IGVjb3N5c3RlbTogaW5jcmVhc2VkIHN0YWJpbGl0eSwgcHJvZHVjdGl2aXR5IGFuZCByZXNpc3RhbmNlIHRvIGRpc3R1cmJhbmNlc15bMV1eLiBNb25pdG9yaW5nIHRoZSBzcGVjaWVzIHJpY2huZXNzLCBkb21pbmFuY2UgYW5kIGNvbXBvc2l0aW9uIGlzIG9mIGNyaXRpY2FsIGltcG9ydGFuY2UgdG8gZGV0ZXJtaW5lIGhvdyBwbGFudCBjb21tdW5pdHkgaXMgYWZmZWN0ZWQgYnkgZW52aXJvbm1lbnRhbCBmYWN0b3JzLiBHbG9iYWwgY2xpbWF0ZSBjaGFuZ2VzIHNpZ25pZmljYW50bHkgYWZmZWN0IHByZWNpcGl0YXRpb24gYW5kIHRlbXBlcmF0dXJlXlsyXV4uIEFzIGEgY29uc2VxdWVuY2UsIGluY3JlYXNlZCB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBmbHVjdHVhdGlvbnMgd2lsbCByZXN1bHQgaW4gY29tcG9zaXRpb24gYW5kIHJpY2huZXNzIGNoYW5nZXMuIEluIGdlbmVyYWwsIHNwZWNpZXMgcmljaG5lc3MgdGVuZCB0byBpbmNyZWFzZSB3aXRoIHRlbXBlcmF0dXJlIGluY3JlYXNpbmcuIFJpY2huZXNzIHdpbGwgaW5jcmVhc2UgdG8gYSBtYXhpbXVtIHVudGlsIHdhdGVyIGRlZmljaXRzIHdoZXJlIGl0IHdpbGwgYmVnaW4gdG8gZGVwcmVzc15bM11eLiBJbmNyZWFzZWQgcHJlY2lwaXRhdGlvbiBhbHNvIGJlbmVmaXRzIHNwZWNpZXMgcmljaG5lc3MgYnkgaW1wcm92aW5nIHNvaWwgbnV0cmllbnQgYXZhaWxhYmlsaXR5IGFuZCBpbmNyZWFzaW5nIG1ldGFib2xpc21eWzRdXi5IdW1hbiBhY3Rpdml0aWVzIHN1Y2ggYXMgbW93aW5nLCBncmF6aW5nIGFuZCBmZXJ0aWxpemF0aW9uIHdpbGwgY2F1c2UgbGFuZCBkZWdyYWRhdGlvbiBhbmQgc29pbCBlcm9zaW9uLCBhbmQgY29uc2VxdWVudGx5IGRlZ3JhZGVkIHRoZSB2ZWdldGF0aW9uIGNvdmVyXls1XV4uIApJbiB0aGlzIHN0dWR5LCB3ZSBhbmFseXplZCB0d28gbW9uaXRvcmVkIHRlbXBlcmF0ZSBncmFzc2xhbmQgY29tbXVuaXRpZXMgaW4gdGhlIG5vcnRoZXJuIFJvY2t5IE1vdW50YWlucyBvZiBNb250YW5hLCBVU0EsIHdpdGhpbiBZZWxsb3dzdG9uZSBOYXRpb25hbCBQYXJrIGFuZCB0aGUgTmF0aW9uYWwgQmlzb24gUmFuZ2UuIFZlZ2V0YXRpb24gcmljaG5lc3MgaXMgZXN0aW1hdGVkIGFzIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBlbmNvdW50ZXJlZCBhY3Jvc3MgYWxsIHRyYW5zZWN0cy4gWWVsbG93c3RvbmUgTmF0aW9uYWwgUGFyayhZTlApaXMgbG9jYXRlZCBhdCBNb250YW5hJ3Mgc291dGhlcm4gYm9yZGVyLCB3aGljaCBpcyBtb3VudGFpbm91cyBhbmQgaGlnaGx5IHRvdXJpc3RpYy4gVGhlIG5vcnRoZXJuIGJvdW5kYXJ5IGFyZWEgaXMgZG9taW5hdGVkIGJ5IG5hdGl2ZSBncmFzcyBhbmQgc2hydWIgY29tbXVuaXRpZXMuIFRoZSBOYXRpb25hbCBCaXNvbiBSYW5nZShOQlIpIGlzIGxvY2F0ZWQgaW4gTW9udGFuYSdzIHdlc3Rlcm4gYm91bmRhcnkuIEJvdGggYXJlIGRvbWluYXRlZCBieSBuYXRpdmUgYnVuY2hncmFzc2VzLCBpbmNsdWRpbmcgUHNldWRvcm9lZ25lcmlhIHNwaWNhdGEgKFB1cnNoKSBBLiBMb3ZlLCBGZXN0dWNhIGlkYWhvZW5zaXMgRWxtZXIsIGFuZCBGLmFsdGFpY2EgVHJpbiwgYW5kIGJvdGggb2YgWU5QIGFuZCBOQlIgaGF2ZSBleHBlcmllbmNlZCBjbGltYXRlIGNoYW5nZSwgZ3JhemluZywgYW5kIG5vbi1uYXRpdmUgc3BlY2llcyBpbnZhc2lvbi4gVGhlIGdyYXNzbGFuZHMgYXJlIHVuaXF1ZSBiZWNhdXNlIHRoZXkgZXhpc3QgaW4gY29vbCwgc2VtaS1hcmlkIG5vcnRoZXJuIGxhbmRzY2FwZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGhpZ2hseSBhZmZlY3RlZCBieSBodW1hbiBhY3Rpdml0aWVzLCBhbmQgaGF2ZSBiZWVuIHJlc2FtcGxlZCBpbiB0aGUgcGFzdCA1MCB5ZWFycy4gSW4gMTk1NywgWU5QIHBlcnNvbm5lbCBjb25zdHJ1Y3RlZCB2YXJpb3VzIGZpdmUtYWNyZSBleGNsb3N1cmVzIGluIHRoZSBub3J0aGVybiB3aW50ZXIgcmFuZ2UgdGhhdCBlbGltaW5hdGVkIGh1bnRpbmcgb2YgbGFyZ2UgYW5pbWFscy4gU2V2ZXJhbCB0cmFuc2VjdHMgd2VyZSBzZXQgdXAgaW5zaWRlIGVhY2ggZXhjbG9zdXJlLiBPdXRzaWRlIHRoZSBleGNsb3N1cmVzLCBhIGZldyB0cmFuc2VjdHMgd2VyZSBidWlsdCBhbmQgb3BlbiB0byBiaWctZ2FtZSBodW50aW5nLiBOQlIgYWxzbyBlc3RhYmxpc2hlZCBhIGV4cGVyaW1lbnQgdG8gaW52ZXN0aWdhdGUgdGhlIGVmZmVjdHMgb2YgbWFuYWdlZCBncmF6aW5nLiBUaGUgdHJhbnNlY3RzIHdlcmUgaW4gYXJlYXMgd2hlcmUgYmlzb25zIGFyZSByZXN0cmljdGVkIHRvIHRoZSByZWZ1Z2UuIFZlZ2V0YXRpb24gaGl0cyBpbmNsdWRlIGVpdGhlciBvdmVyc3Rvcnkgb3IgdW5kZXJzdG9yeSBpbiB0aGUgY2Fub3B5LiBTdWJzdHJhdGUgd2VyZSByZWNvcmRlZCBhcyBiYXJlIGdyb3VuZCwgcm9jaywgcGF2ZW1lbnQsIGxpdHRlciBvciBtb3NzL2xpY2hlbl5bNl1eLiAKT3VyIHF1ZXN0aW9ucyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6IChpKURvZXMgdGhlIHZlZ2V0YXRpb24gcmljaG5lc3Mgb2YgdGhlIGdyYXNzbGFuZCBjb21tdW5pdHkgY2hhbmdlIG92ZXIgdGltZSBhbmQgdHJhbnNlY3RzPyAoaWkpVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGVudmlyb25tZW50YWwgZmFjdG9yczogYmFyZXNvaWwsIHJvY2ssIGxpdHRlciwgZmFsbCBwcmVjaXBpdGF0aW9uLCBtYXhpbXVtIHNwcmluZyB0ZW1wZXJhdHVyZS4gKGlpaSlUaGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgb2YgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJlZGljdG9yIHZlZ2V0YXRpb24gcmljaG5lc3MgYW5kIGV4cGxhbmF0b3J5IHZhcmlhYmxlcy4gV2Ugd2lsbCBjb25kdWN0IGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHRvIGFuc3dlciB0aGVzZSBxdWVzdGlvbnMuIEZpcnN0LCB3ZSB3aWxsIHBlcmZvcm0gYSB0d28td2F5IEFOT1ZBIHRvIGV4cGxvcmUgdGhlIHRpbWUgYW5kIHRyYW5zZWN0IGVmZmVjdHMgb24gdmVnZXRhdGlvbiByaWNobmVzcy4gU2Vjb25kLCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdmFyaWFibGVzIHRvIGRldGVjdCB0aGUgaXNzdWUgb2YgY29sbGluZWFyaXR5LiBNdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBpcyB0aGVuIGFwcGxpZWQuIFdlIHdpbGwgZml0IHRoZSBtb2RlbCB3aXRoIGZpeGVkIGVmZmVjdHMgYW5kIG1peGVkIGVmZmVjdHMuIFR3byBhcHByb2FjaGVzOiBMaWtlbGlob29kLXJhdGlvIHRlc3QgYW5kIEFJQyB3aWxsIGJlIGltcGxlbWVudGVkIHRvIHNlbGVjdCBtb2RlbCBhbmQgcGFyYW1ldGVycy4gTW9kZWwgYXZlcmFnaW5nIHdpbGwgYmUgY2FycmllZCBvbiBwbGF1c2libGUgbW9kZWxzLiBGaW5hbGx5LCB0aGUgc2VsZWN0ZWQgbW9kZWwgd2lsbCBiZSB2YWxpZGF0ZWQgYW5kIGNvbXBhcmVkIHdpdGggdGhlIG1lYW4gdG8gc2VlIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBtb2RlbC4KCiMjIE1ldGhvZAoKIyMjIERhdGEgY29sbGVjdGlvbiBhbmQgdmFyaWFibGVzCgpUaGUgdHJhbnNlY3RzIHdlcmUgbnVtZXJpY2FsbHkgb2RlZCB3aXRoIG51bWJlciAxLTEyLCBhbmQgaGF2ZSBiZWVuIHNhbXBsZWQgdXNpbmcgZXhhY3RseSB0aGUgc2FtZSBtZXRob2RzLiBBbG9uZyBlYWNoIHRyYW5zZWN0IGxpbmUsIHZlZ2V0YXRpb24gb3Igc3Vic3RyYXRlIGVuY291bnRlcmVkIGF0IDAuMzNtIG1hcmsgd2FzIHJlY29yZGVkLiBWZWdldGF0aW9uIGhpdHMgaW5jbHVkZSBlaXRoZXIgb3ZlcnN0b3J5IG9yIHVuZGVyc3RvcnkgaW4gdGhlIGNhbm9weS4gU3Vic3RyYXRlIHdlcmUgcmVjb3JkZWQgYXMgYmFyZSBncm91bmQsIHJvY2ssIGFuZCBsaXR0ZXJeWzddXi4KVGhlIGNsaW1hdGUgb2YgYm90aCBZTlIgYW5kIE5CUiBpcyBzZW1pLWFyaWQuIFRoZSBzcGVjaWZpYyB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiB2YWx1ZXMgd2VyZSBjb2xsZWN0ZWQgZnJvbSB0aGUgbmVhcmVzdCBtb25pdG9yaW5nIHNpdGUgdXNpbmcgYSBTT0dTKHN1cmZhY2Ugb2JzZXJiYXRpb24gZ3JpZGRpbmcgc3lzdGVtKSB3aXRoIGFkanVzdG1lbnQgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc2VjdCdzIGVsZXZhdGlvbiwgc2xvcGUsIGFzcGVjdCBhbmQgbG9jYXRpb24gb24gdGhlIGxhbmRzY2FwZS4gVGhlIGNsaW1hdGUgdmFyaWFibGVzIGluY2x1ZGUgbWVhbiBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciBTcHJpbmcoU3ByVG1heCksIGFuZCB0b3RhbCBwcmVjaXBpdGF0aW9uIGZvciBGYWxsKEZhbGxQcmVjKS4gVGhlcmUgYXJlIDY0IHJvd3Mgb2YgZGF0YSBhbmQgOSBjb2x1bW5zIGFzIHZhcmlhYmxlcyB3aGljaCBhcmUgU0FNUExFWVIsIFRpbWUsIFRyYW5zZWN0LCBSaWNobmVzcywgUk9DSywgTElUVEVSLCBCQVJFU09JTCwgRmFsbFByZWMsIFNwclRtYXguIAoKIyMjIERhdGEgY2xlYW5pbmcKCkFsbW9zdCBhbnkgZGF0YSBhbmFseXNpcyByZXF1aXJlcyBkYXRhIGNsZWFuaW5nLiBJdCBpcyB0aGUgcHJvY2VzcyBvZiBpZGVudGlmeWluZyBlcnJvbmVvdXMsIGluY29ycmVjdGx5IGZvcm1hdHRlZCwgZHVwbGljYXRlIG9yIGluY29tcGxldGUgZGF0YSwgcmVtb3ZpbmcgdGhlbSBmcm9tIHRoZSBkYXRhc2V0LCBtZXJnaW5nIHRoZSBkYXRhLCBhbmQgcHJlcGFyaW5nIHRoZSBkYXRhIGZvciBtb2RlbGluZ15bOF1eLiBJbiBvdXIgdmVnZXRhdGlvbiBkYXRhc2V0LCB3ZSByZW1vdmUgdGhlIGluY29tcGxldGUgcm93cyBieSByZW1vdmluZyB0aGUgcm93cyBjb250YWluZWQgTkEuIFRoZXJlIGFyZSA1OCByb3dzIG9mIGRhdGEgbGVmdC4KCiMjIyBEYXRhIGV4cGxvcmF0aW9uCgpXaGVuIHdlIGFjY2VzcyB0aGUgZGF0YSwgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gdmlzdWFsaXplIHRoZSBkYXRhIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgZGF0YSBvdXRsaWVycywgbm9ybWFsaXR5LCBsaW5lYXIgYW5kIG5vbi1saW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdmFyaWFibGVzLCBhc2sgcXVlc3Rpb25zIHN1Y2ggYXMgd2hlcmUgYXJlIHRoZSBkYXRhIGNlbnRlcmVkLCBob3cgYXJlIHRoZXkgc3ByZWFkLCBhbmQgd2hldGhlciBkYXRhIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkXls5XV4uCgojIyMjIEJveHBsb3QKCkJveHBsb3QsIG9yIGJveC1hbmQtd2hpc2tlciBwbG90LCB2aXN1YWxpemVzIHRoZSBtZWFuIGFuZCBzcHJlYWQgb2YgYSBkYXRhc2V0IGJhc2VkIG9uIGZpdmUtbnVtYmVyIHN1bW1hcnk6IHRoZSBtaW5pbXVtLCB0aGUgbWF4aW11bSwgdGhlIHNhbXBsZSBtZWRpYW4sIGFuZCB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YXJ0aWxlcy4gRnJvbSBib3hwbG90LCB3ZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBkYXRhIGlzIHN5bW1ldHJpY2FsIGFuZCBob3cgdGlnaHRseSBpdCBpcyBncm91cGVkLiBCb3hwbG90IGNhbiBhbHNvIGJlIHVzZWQgdG8gYW5hbHl6ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB2YXJpYWJsZXMuIApJbiB0aGlzIGNhc2UsIHdlIGRyYXcgYSBib3hwbG90IG9mIHZlZ2V0YXRpb24gcmljaG5lc3MgYW5kIGJveHBsb3RzIG9mIHZlZ2V0YXRpb24gcmljaG5lc3MgY29uZGl0aW9uYWwgb24gdGhlIG5vbWluYWwgdmFyaWFibGVzOiB0cmFuc2VjdCBhbmQgdGltZSByZXNwZWN0aXZlbHkuCgojIyMjIERvdCBwbG90CgpEb3QgcGxvdHMgcmVwcmVzZW50IGVhY2ggaW5kaXZpZHVhbCBvYnNlcnZhdGlvbiBpbiBhIGdyb3VwIGRhdGEgcG9pbnRzIGJhc2VkIG9uIGEgbm9taW5hbCB2YXJpYWJsZV5bMTBdXi4gSXQgaXMgYSB1c2VmdWwgdG9vbCBmb3IgaWRlbnRpZmljYXRpb24gb2Ygb3V0bGllcnMgYW5kIGhvbW9nZW5laXR5LiBUaGUgeCBheGlzIGxhYmVsIHNob3dzIHRoZSByYW5nZSBvZiB2YWx1ZXMsIGFuZCB5IGF4aXMgcmVwcmVzZW50cyB0aGUgaWRlbnRpdHkgb2YgdGhlIGRhdGEgcG9pbnRzLlRoZSBwYWNrYWdlIG9mIGludGVyZXN0IGlzICoqZ2dwbG90MioqLgoKIyMjIyBTY2F0dGVycGxvdAoKU2NhdHRlcnBsb3QgaXMgYSB1c2VmdWwgdG9vbCB0byB2aXN1YWxseSBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gdmFyaWFibGVzIGJ5IHBsb3R0aW5nIG9uZSBwcmVkaWN0b3IgdmFyaWFibGUgYWxvbmcgdGhlIGhvcml6b250YWwgYXhpcyBhbmQgdGhlIHJlc3BvbnNlIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzLiBUbyBoZWxwIHZpc3VhbGl6ZSB0aGUgcmVsYXRpb25zaGlwLCBhIHJlZ3Jlc3Npb24gbGluZSBpcyBvZnRlbiBhZGRlZCB0byB0aGUgcGxvdC4KCiMjIyMgUGFpcnBsb3QKClBhaXJwbG90LCBvciBzY2F0dGVycGxvdCBtYXRyaXgsIHNob3dzIG11bHRpcGxlIHBhaXItd2lzZSBzY2F0dGVycGxvdHMgaW4gb25lIGdyYXBoIGFuZCBjYW4gYmUgdXNlZCB0byBhbmFseXplIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMsIGFuZCBiZXR3ZWVuIHZhcmlhYmxlcyBhbmQgcmVzcG9uc2UuIFRoZSBwYWlycGxvdCBvZiBleHBsYW5hdG9yeSB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IGNvbGxpbmVhcml0eS4gVGhlIHBhaXJwbG90IG9mIGFsbCByZXNwb25zZSBhbmQgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGZvciBqdWRnaW5nIHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZXNwb25zZSBhbmQgcHJlZGljdG9ycyBhcmUgbGluZWFyLiBXZSB1c2VkIHRoZSAqKlIqKiBiYXNlIGZ1bmN0aW9uICoqcGFpcnMoKSoqLgoKIyMjIyBDb3JyZWxhdGlvbgoKQ29ycmVsYXRpb24sIG9yIGRlcGVuZGVuY2UsIHJlZmVycyB0byB0aGUgZGVncmVlIHRvIHdoaWNoIGEgcGFpciBvZiB2YXJpYWJsZXMgYXJlIGxpbmVhcmx5IHJlbGF0ZWQuIFBvc2l0aXZlIGNvcnJlbGF0aW9uIGluZGljYXRlcyB0aGF0IHZhcmlhYmxlcyBpbmNyZWFzZSBvciBkZWNyZWFzZSB0b2dldGhlciwgd2hpbGUgbmVnYXRpdmUgY29ycmVsYXRpb24gaW5kaWNhdGVzIHRoYXQgd2l0aCBvbmUgdmFyaWFibGUgaW5jcmVhc2luZywgdGhlIG90aGVyIGRlY3JlYXNlcywgYW5kIHZpY2UgdmVyc2EuIFdoZW4gcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgaGlnaGx5IGNvcnJlbGF0ZWQsIHRoZXkgY2Fubm90IGluZGVwZW5kZW50bHkgcHJlZGljdCB0aGUgcmVzcG9uc2UsIHJlc3VsdGluZyBpbiBjb2xsaW5lYXJpdHkuIEhvd2V2ZXIsIHRoZSB0aHJlc2hvbGRzIG9mIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyB8cnw8MC43IGlzIGFuIGluZGljYXRvci4gSWYgfHJ8IDwwLjcsIGNvbGxpbmVhcml0eSB3aWxsIG5vdCBiZSBhIGJpZyBjb25jZXJuIGluIHJlZ3Jlc3Npb24gYW5hbHlzaXNeWzExXV4uIFdlIHVzZSAqKlIqKiBwYWNrYWdlICoqY29ycnBsb3QqKiB0byB2aXN1YWxpemUgdGhlIGNvcnJlbGF0aW9uIGFuZCAqKlJDb2xvckJyZXdlcioqIHBhY2thZ2UgdG8gbWFuYWdlIGNvbG9ycy4KCiMjIyBCYWxhbmNlZC9JbWJhbGFuY2VkIERhdGEKCiBJbiBtaXhlZCBlZmZlY3QgbW9kZWwsIGlmIHRoZXJlIGlzIHZlcnkgaGlnaCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG51bWJlcnMgb2Ygb2JzZXJ2YXRpb25zIGluIGdyb3VwcywgdGhlbiB3ZSBjYW4gc2F5IG91ciBkYXRhc2V0IGlzIGltYmFsYW5jZWQuIFRoZSBncm91cCB3aXRoIG1vcmUgb2JzZXJ2YXRpb25zIGlzIG92ZXJwcmVzZW50ZWQsIGFuZCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRoZXkgY2FuIG91dHdlaWdoIG90aGVycyBhbmQgdmljZSB2ZXJzYSBmb3IgdW5kZXJyZXByZXNlbnRlZCBncm91cHMuIEhhdmluZyBhIGJhbGFuY2VkIGRhdGEgc2V0IGZvciBhIG1vZGVsIHdvdWxkIGdlbmVyYXRlIGhpZ2hlciBhY2N1cmFjeSBtb2RlbHMuIFdlIHVzZSAqKmJhcnBsb3RzKiogdG8gcGxvdCB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGRpZmZlcmVudCB0aW1lIGdyb3VwcyBhbmQgdHJhbnNlY3RzLgoKIyMjIFR3by13YXkgQU5PVkEKCkEgdHdvLXdheSBBTk9WQSBpcyB1c2VkIHRvIGVzdGltYXRlIGhvdyB0aGUgbWVhbiBvZiBhIHF1YW50aXRhdGl2ZSB2YXJpYWJsZSBjaGFuZ2VzIGFjY29yZGluZyB0byB0aGUgbGV2ZWxzIG9mIHR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuIEl0IGV4YW1pbmVzIHRoZSBpbmZsdWVuY2Ugb2YgdHdvIGRpZmZlcmVudCBjYXRlZ29yaWNhbCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgb24gb25lIGNvbnRpbnVvdXMgZGVwZW5kZW50IHZhcmlhYmxlLiBUaGUgdHdvLXdheSBBTk9WQSBtb2RlbCBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGFzOgokJFxtdSBfe3tpan19PVxtdSArXGFscGhhIF97aX0rXGJldGEgX3tqfStcZ2FtbWEgX3t7aWp9fSQkCkhvd2V2ZXIsIHNpbmNlIHRoZXJlIGlzIG5vIHJlcGxpY2F0aW9uIHdpdGhpbiBlYWNoIGdyb3VwLCB3ZSBjYW4gc3RpbGwgdGVzdCB0aGUgdHdvIG1haW4gZWZmZWN0cywgYnV0IGNhbm5vdCB0ZXN0IHRoZSBpbnRlcmFjdGlvbi4gV2UgZGlkIHRoZSB0d28td2F5IEFOT1ZBIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJhY3Rpb24uIFRoZW4gdGhlIG1vZGVsIGlzIHJlcHJlc2VudGVkIGFzOgokJFxtdSBfe3tpan19PVxtdSArXGFscGhhIF97aX0rXGJldGEgX3tqfSQkClRoZSB0d28gbWFpbiBlZmZlY3RzIGluIHRoaXMgY2FzZSBhcmUgdGltZSBhbmQgdHJhbnNlY3QuIFdlIHVzZWQgKiphb3YqKiBmdW5jdGlvbiB0byBkbyB0aGUgQU5PVkEgdGVzdC4KCiMjIyBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbiB3aXRoIEdlbmVyYWxpemVkIExlYXN0IFNxdWFyZXMKClRoZXJlIGFyZSB0eXBpY2FsbHkgbXVsdGlwbGUgdmFyaWFibGVzIGluZmx1ZW5jZSB2ZWdldGF0aW9uIHJpY2huZXNzLiBXZSBjYW4gZGVzY3JpYmUgdGhlIHJlbGF0aW9uc2hpcCBieSBhbgppbnRlcmNlcHQgKCRcYmV0YSBfezB9JCkgYW5kIGEgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgKCRcYmV0YSBfezF9JCwgJFxiZXRhIF97Mn0kLCAuIC4gLiAsICRcYmV0YSBfe219JCk6CiQkeV97aX0gPSBcYmV0YV97MH0gKyBcYmV0YV97MX14X3sxaX0gKyBcYmV0YV97Mn14X3syaX0gK1xiZXRhX3szfXhfezNpfStcYmV0YV97NH14X3s0aX0rXGJldGFfezV9eF97NWl9K1xlcHNpbG9uX3tpfSQkCldpdGggcGFyYW1ldGVyczokXGJldGFfezB9JDpJbnRlcmNlcHQsICRcYmV0YV97MX0kOlJvY2ssICRcYmV0YV97Mn0kOkxpdHRlciwgJFxiZXRhX3szfSQ6QmFyZXNvaWwsICRcYmV0YV97NH0kOiBGYWxsIHByZWNpcGl0YXRpb24sICRcYmV0YV97NX0kOiBNYXhpbXVtIFNwcmluZyBUZW1wZXJhdHVyZS4KV2UgaW5zdGFsbGVkIHRoZSAqKlIqKiBwYWNrYWdlICoqbmxtZSoqKExpbmVhciBhbmQgTm9ubGluZWFyIE1peGVkIEVmZmVjdHMgTW9kZWxzKSBhbmQgdXNlZCB0aGUgZnVuY3Rpb24gKipnbHMoKSoqLCBmaXR0aW5nIGxpbmVhciBtb2RlbCB1c2luZyBHZW5lcmFsaXplZCBMZWFzdCBTcXVhcmVzLCB0aGUgZGVmYXVsdCBtZXRob2QgaXMgcmVzdHJpY3RlZCBtYXhpbXVtIGxpa2VsaWhvb2QoUkVNTCkuCgojIyMjIEdlbmVhcmFsaXplZCBMZWFzdCBTcXVhcmVzCgpJbiBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIE1vZGVsLCB3ZSBtaW5pbWl6ZSB0aGUgc3VtIG9mIHNxdWFyZWQgcmVzaWR1YWxzKFNTUik6CiAkJFNTUiA9IGVee1R9ZVxcPShZLVhcaGF0e1xiZXRhfSlee1R9KFktWFxoYXR7XGJldGF9KSQkCiAKICQkXGhhdHtcYmV0YX09YXJnbWluX3tcaGF0e1xiZXRhfX1TU1IkJAogJCRcaGF0e1xiZXRhfT0oWF57VH1YKV57LTF9WF57VH1ZJCQKIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIHNldCBvZiBtYXRoZW1hdGljYWwgcmVzdHJpY3Rpb25zIHVuZGVyIHdoaWNoIHRoZSBvcmRpbmFyeSBsZWFzdCBzcXVhcmVkKE9MUykgZXN0aW1hdG9yIGlzIHRoZSBCZXN0IExpbmVhciBVbmJpYXNlZCBFc3RpbWF0b3IgKEJMVUUpLiBHZW5lYXJsIGxlYXN0IHNxdWFyZXMoR0xTKSBpcyBtb3JlIGVmZmljaWVudCB0aGFuIE9MUyB1bmRlciBoZXRlcm9zY2VkYXN0aWNpdHkgb3IgYXV0b2NvcnJlbGF0aW9uLlsxMl0KVG8gcmVjb3ZlciB0aGUgQkxVRSBlc3RpbWF0b3IsIHRoZSBHTFMgYXBwcm9hY2ggaXMgdG8gdHJhbnNmb3JtIHRoZSBtb2RlbCB0byBhIG5ldyBzZXQgb2Ygb2JzZXJ2YXRpb25zIHRoYXQgc2F0aXNmeSB0aGUgY29uc3RhbnQgdmFyaWFuY2UgYXNzdW1wdGlvbiwgYW5kIHRoZW4gdXNlIE9MUy4KIEdpdmVuIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBleHByZXNzZWQgYXM6CiAkJFZhcihcZXBzaWxvbik9XHNpZ21hXjJWJCQKIFYgaXMgYSAkJG5cdGltZXMgbiQkIG1hdHJpeC4gV2UgY2FuIGRlZmluZToKICQkVj1LXntUfUs9S0skJAogJCRlJz1LXnstMX1lXFxZJz1LXnstMX1ZXFxYJz1LXnstMX1YJCQKJCQgU1NSPWUnXntUfWUnXFw9KFknLVgnXGhhdHtcYmV0YX0pXntUfShZJy1YJ1xoYXR7XGJldGF9KSQkCiQkXGhhdHtcYmV0YV97R0xTfX09YXJnbWluX3tcaGF0e1xiZXRhX3tHTFN9fX1TU1IkJAokJFxoYXR7XGJldGFfe0dMU319PShYXlRWXnstMX1YKV57LTF9WF5UVl57LTF9WSQkCgoKIyMjIyBQYXJhbXRlciBJbnRlcmFjdGlvbgoKSW4gY29tcGxleCBzeXN0ZW1zIHN1Y24gYXMgcGxhbnQgY29tbXVuaXR5LCB2YXJpYWJsZXMgb2Z0ZW4gaW50ZXJhY3Qgd2l0aCBlYWNoIG90aGVyIHRvIGluZmx1ZW5jZSBvdXRjb21lcy5UaGUgZ3Jhc3NsYW5kIGVjb3N5c3RlbSByZXNwb25zZSB2YXJpZXMgZHVlIHRvIGludGVyYWN0aW9uIG9mIGNoYW5nZXMgaW4gYm90aCB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbi4gUHJldmlvdXMgcmVzZWFyY2ggZm91bmQgdGhhdCBidW5jaGdyYXNzIHByb2R1Y3Rpdml0eSBpbiBOYXRpb25hbCBCaXNvbiBSYW5nZSBpbmNyZWFzZWQgd2l0aCBncm93aW5nIHNlYXNvbiBwcmVjaXBpdGF0aW9uLCB3aGlsZSB3YXJtaW5nIHdlYXRoZXIgYWxvbmUgaGFzIG5vIHNpZ25pZmljYW50IGVmZmVjdF5bMTNdXi4gV2UgYWRkIGFuIGludGVyYWN0aW9uIHRlcm0gb2YgZmFsbCBwcmVjaXBpdGF0aW9uKEZhbGxQcmVjKSBhbmQgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUoU3ByVG1heCk6CiQkeV97aX0gPSBcYmV0YV97MH0gKyBcYmV0YV97MX14X3sxaX0gKyBcYmV0YV97Mn14X3syaX0gKyBcYmV0YV97M314X3szaX0rXGJldGFfezR9eF97NGl9K1xiZXRhX3s1fXhfezVpfStcYmV0YV97Nn14X3s0aX14X3s1aX0rXGVwc2lsb25fe2l9JCQKJFxiZXRhX3s2fSQgaXMgdGhlIHBhcmFtZXRlciBvZiBwcmVjaXBpdGF0aW9uIGFuZCB0ZW1wZXJhdHVyZSBpbnRlcmFjdGlvbiB0ZXJtLgoKIyMjIFRpbWUgRWZmZWN0CgpUaGUgc3BlY2llcyByaWNobmVzcyBpcyBub3Qgb25seSBhZmZlY3RlZCBieSBlbnZpcm9ubWVudGFsIGZhY3RvcnMsIGJ1dCBhbHNvIGJ5IHRpbWUgaW5kaXJlY3RseSBjaGFuZ2luZyBiaW90aWMgYW5kIGFib3RpYyBjb25kaXRpb25zXlsxNF1eLiBUaW1lIHNlcmllcyBhbmFseXNpcyB3aGljaCBpcyBhcHBsaWVkIHRvIGRhdGEgY29udGludW91cyB0aHJvdWdoIHRpbWUsIGNhbm5vdCBiZSB1c2VkIG9uIG91ciBkYXRhc2V0LiBXZSBwbG90dGVkIHRoZSBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIHZlcnN1cyB0aW1lIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBleHBsYWlucyB0aGUgdGVtcG9yYWwgcGF0dGVybi4gQSBMT0VTUyBzbW9vdGhlciB3YXMgYWRkZWQgdG8gYXNzaXN0IHZpc3VhbGl6YXRpb24uCgojIyMgTGluZWFyIE1peGVkIEVmZmVjdHMgTW9kZWwKCk5lc3RlZCBkYXRhIG9mdGVuIGdlbmVyYXRlZCBpbiBtdWx0aXBsZSBmaWVsZCBzaXRlcy4gRnJvbSB0aGUgcHJldmlvdXMgYm94cGxvdCBhbmQgdGltZSBlZmZlY3RzIGFuYWx5c2lzLCB0aGUgZGF0YSBzaG93cyBhIG5lc3RlZCBzdHJ1Y3R1cmU6IG9ic2VydmF0aW9ucyBiZWxvbmcgdG8gbmVzdHMgb3Igc3ViZ3JvdXBzIHdpdGhpbiBhIHBvcHVsYXRpb24uIFRoZSBzdWJncm91cHMgaGVyZSBhcmUgZGlmZmVyZW50IHRyYW5zZWN0cy4KTGluZWFyIG1peGVkIGVmZmVjdHMgbW9kZWwgaXMgYSBsaW5lYXIgbW9kZWwgdGhhdCBpbmNvcnBvcmF0ZXMgZml4ZWQgYW5kIHJhbmRvbSBlZmZlY3RzLiBSYW5kb20gZWZmZWN0cyByZWZlciB0byBwYXJhbWV0ZXJzIHRoYXQgYXJlIGFzc3VtZWQgdG8gcmFuZG9tbHkgdmFyeWluZyBhcm91bmQgYSBwb3B1bGF0aW9uIG1lYW4uIEZpeGVkIGVmZmVjdHMgZG8gbm90IHZhcnkuIFRoZSBtaXhlZCBlZmZlY3RzIG1vZGVsIGNhbiBiZSBleHByZXNzZWQgYXM6CiQkeT1YXGJldGErWlxtYXRoYmZ7Yn0rXGVwc2lsb24kJAokeSQgaXMgdGhlIG1hdHJpeCBvZiBvYnNlcnZhdGlvbjsgJFgkIGlzIGEgbWF0cml4IG9mIOKAmGZpeGVk4oCZIHByZWRpY3RvciB2YXJpYWJsZXM7ICRcYmV0YSQgaXMgYSB2ZWN0b3Igb2YgZml4ZWQgZWZmZWN0czsgJFokIGlzIGEgbWF0cml4IG9mIHJhbmRvbSBwcmVkaWN0b3IgdmFyaWFibGVzOyAkXG1hdGhiZntifSRpcyBhIHZlY3RvciBvZiByYW5kb20gZWZmZWN0czsgJFxlcHNpbG9uJGlzIHRoZSBkaXN0cmlidXRpb24gb2YgZXJyb3JzLgokJFxtYXRoYmZ7Yn1fe2l9XHNpbVxtYXRoY2Fse059KDAsR197aX0pJCQKJCRcZXBzaWxvblxzaW1cbWF0aGNhbHtOfSgwLFxzaWdtYV97aX0pJCQKVGlhbnl1IGV0IGFsLjIwMjAgcHJvcG9zZWQgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoZW4gaW52ZXN0aWdhdGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gTkRWSShOb3JtYWxpemVkIERpZmZlcmVuY2Ugb2YgVmVnZXRhdGlvbiBJbmRleCkgYW5kIG1ldGVvcm9sb2dpY2FsIHZhcmlhYmxlcyhwcmVjaXBpdGF0aW9uIGFuZCB0ZW1wZXJhdHVyZSleWzE1XV4uCjEuIFJhbmRvbSBpbnRlcmNlcHQgb25seQoyLiBSYW5kb20gaW50ZXJjZXB0IGFuZCByYW5kb20gc2xvcGUgb2YgcHJlY2lwaXRhdGlvbgozLiBSYW5kb20gaW50ZXJjZXB0IGFuZCByYW5kb20gc2xvcGUgb2YgdGVtcGVyYXR1cmUKNC4gUmFuZG9tIGludGVyY2VwdCBhbmQgcmFuZG9tIHNsb3BlIG9mIGJvdGggcHJlY2lwaXRhdGlvbiBhbmQgdGVtcGVyYXR1cmUKSGVyZSBpbiBvdXIgY2FzZSwgd2UgZml0IHRoZSByYW5kb20gaW50ZXJjZXB0IG9ubHkgbW9kZWwsIGFuZCByYW5kb20gaW50ZXJjZXB0IGFuZCBzbG9wZSBvZiBmYWxsIHByZWNpcGl0YXRpb24gbW9kZWwgdXNpbmcgKipsbWUoKSoqIChMaW5lYXIgTWl4ZWQtRWZmZWN0cyBNb2RlbHMpZnVuY3Rpb24gaW4gKipubG1lKiogcGFja2FnZS4KCiMjIyBJZGVudGlmeSB0aGUgZml4ZWQgZWZmZWN0cyBzdHJ1Y3R1cmUKClRoZSBnb2FsIG9mIG1vZGVsaW5nIGlzIHRvIGRldGVybWluZSB0aGUgYmVzdCBwb3NzaWJsZSBtb2RlbCB0aGF0IGNhcHR1cmVzIGFsbCBvZiBpbXBvcnRhbnQgZmVhdHVyZXMgb2Ygb3VyIGRhdGEuIEFkZGluZyBwYXJhbWV0ZXJzIG1heSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBhbmQgbGVhZCB0byBiZXR0ZXIgZml0IG91dGNvbWUsIGJ1dCBhbHNvIGluY3JlYXNlIHRoZSByaXNrIG9mIG92ZXJmaXR0aW5nLiBUaGVyZSBhcmUgYSBmZXcgbW9kZWwgZXZhbHVhdGlvbiBzdGF0aXN0aWNzIGluY2x1ZGluZyAkQUlDJCwgYW5kIGxpa2VsaWhvb2QtcmF0aW8gdGVzdCgkTFJUJCkuCi0tLQoKfCBNb2RlbCBOYW1lICAgIHwgRml4ZWQtZWZmZWN0cyBWYXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJhbmRvbS1lZmZlY3RzIFZhcmlhYmxlcyB8Cnw6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fAp8IGxyICAgICAgICAgICAgfCBTb2lsLCBMaXR0ZXIsIEJhcmVzb2lsLCBNYXhpbXVtIHNwcmluZyB0ZW1wZXJhdHVyZSxGYWxsIHByZWNpcGl0YXRpb24gICAgICAgICAgICAgICAgIHwgTi9BICAgICAgICAgICAgICAgICAgICAgIHwKfCBscjEgICAgICAgICAgIHwgU29pbCwgTGl0dGVyLCBCYXJlc29pbCwgTWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUsRmFsbCBwcmVjaXBpdGF0aW9uIGFuZCBpbnRlcmFjdGlvbiB8IE4vQSAgICAgICAgICAgICAgICAgICAgICB8CnwgbW9kMSAgICAgICAgICB8IFNvaWwsIExpdHRlciwgQmFyZXNvaWwsIE1heGltdW0gc3ByaW5nIHRlbXBlcmF0dXJlLEZhbGwgcHJlY2lwaXRhdGlvbiAgICAgICAgICAgICAgICAgfCBOL0EgICAgICAgICAgICAgICAgICAgICAgfAp8IG1vZDIgICAgICAgICAgfCBTb2lsLCBMaXR0ZXIsIEJhcmVzb2lsLCBNYXhpbXVtIHNwcmluZyB0ZW1wZXJhdHVyZSxGYWxsIHByZWNpcGl0YXRpb24gICAgICAgICAgICAgICAgIHwgRmFsbCBwcmVjaXBpdGF0aW9uICAgICAgIHwKCldlIGNhbiBwcmVtYXJpbHkgY29tcGFyZSB0aGUgbW9kZWxzIHVzaW5nICoqYW5vdmEoKSoqIGZ1bmN0aW9uOgoKIyMjIyBMaWtlbGlob29kIFJhdGlvIFRlc3QKClRoZSBsaWtlbGlob29kLXJhdGlvIHRlc3QgY29tcGFyZXMgYSBwYWlyIG9mIG5lc3RlZCBtb2RlbHMgYmFzZWQgb24gdGhlIHJhdGlvIG9mIHRoZWlyIGxpa2VsaWhvb2RzLgokJFxsYW1iZGFfe0xSfT0tMihcbG5bXG1hdGhjYWx7TH0oXHRleHRybXtSZWR1Y2VkfSktXG1hdGhjYWx7TH0oXHRleHRybXtGdWxsfSldKSQkCgojIyMjIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24oQUlDKQoKSW5mb3JtYXRpb24gY3JpdGVyaWEoSUMpIGFwcHJvYWNoIGlzIGJhc2VkIG9uIEt1bGxiYWNrLUxlaWJsZXIgaW5mb3JtYXRpb24uIEl0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBiZXN0IG1vZGVscyB0aGF0IG1pbmltaXplcyB0aGUgSy1MIGluZm9ybWF0aW9uIGxvc3MuIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24oQUlDKSBpcyBhIGZhbW91cyBlc3RpbWF0aW9uIG9mIEstTCBpbmZvcm1hdGlvbiBsb3NzLiBBIGxvd2VyIHZhbHVlIG9mIEFJQyBzdWdnZXN0cyB0aGF0IHRoZSBtb2RlbCBleHBsYWlucyB0aGUgZGF0YSBiZXR0ZXIuIEFJQyBpcyByZXByZXNlbnRlZCBieSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOgokJEFJQz0gLTJcbG4oXG1hdGhjYWx7TH0pICsgMlxtYXRoY2Fse0t9JCQKJFxtYXRoY2Fse0x9JCBpcyB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlIG9mIHBhcmFtZXRlcnM7ICRcbWF0aGNhbHtLfSQgaXMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBtb2RlbC4KQSBzbWFsbCBzYW1wbGUgc2l6ZSBiaWFzIGNvcnJlY3Rpb24gZm9yIEFJQyBpcyBBSUNjLCBnaXZlbiBieToKJCRBSUNjPUFJQytcZnJhY3sya14yKzJrfXtuLWstMX0kJAoKIyMjIE1vZGVsIFZhbGlkYXRpb24KCldlIGRpc3BsYXllZCBhIGRpYWdub3N0aWMgY2hlY2sgaW5jbHVkaW5nIHJlc2lkdWFscyBwbG90LCBub3JtYWxpdHksIGNvcnJlbGF0aW9uLCBhbmQgaGV0ZXJvZ2VuZWl0eSBjaGVjayBmb3IgdGhlIHNlbGVjdGVkIG1vZGVsIHRvIGVuc3VyZSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gaXMgdHJ1c3R3b3J0aHkuCldlIHBsb3R0ZWQgdGhlIHJlc2lkdWFscyB2ZXJzdXMgZml0dGVkIHZhbHVlcyB0byBkZXRlY3QgaWYgdGhlcmUgaXMgYW55IHBhdHRlcm4gb2YgcmVsYXRpb25zaGlwIGFuZCBoZXRlcm9zY2VkYXN0aWNpdHkgb2YgdGhlIGRhdGEuIFdlIHVzZWQgaGlzdG9ncmFtIGFuZCBRLVEgcGxvdCB0byBjaGVjayB0aGUgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4gRnVuY3Rpb24gKipxcVBsb3QoKSoqIGlzIGZyb20gdGhlICoqY2FyKiogcGFja2FnZS4gQnkgbWVhbiBjZW50ZXJpbmcgdGhlIHZhcmlhYmxlIHZhbHVlcyB1c2luZyAqKnNjYWxlKCkqKiBmdW5jdGlvbiwgY29sbGluZWFyaXR5IGNhbiBiZSBhbGxldmlhdGVkXlsxNl1eLgoKIyMjIE1vZGVsIEF2ZXJhZ2luZwoKTW9kZWwgYXZlcmFnaW5nIHJlZmVycyB0byB0aGUgcHJvY2VzcyBvZiB1c2luZyBzZXZlcmFsIG1vZGVscyBhdCBvbmNlIGZvciBtYWtpbmcgcHJlZGljdGlvbnMgb3IKaW5mZXJyaW5nIHBhcmFtZXRlcnMuIEl0IGlzIGEgdXNlZnVsIHRvb2wgdG8gZGVhbCB3aXRoIG1vZGVsIHVuY2VydGFpbnR5LiBXZSB3aWxsIGdldCB0aGUgZnVsbCBiZW5lZml0cyBvZiBtb2RlbCBhdmVyYWdpbmcgd2hlbiB0aGUgbW9kZWxzIGFyZSBvZiBoaWdoIHZhcmlhbmNlLiBXZSBzdWJzZXQgYW5kIGF2ZXJhZ2VkIHRoZSBwbGF1c2libGUgbW9kZWxzKG9ubHkgJFxEZWx0YSBBSUNjJCB3aXRoaW4gMikuIFdlIHVzZWQgdGhlICoqc3Vic2V0KCkqKiBmdW5jdGlvbiBhbmQgKipjb25maW50KCkqKiB0byBlc3RpbWF0ZSBwYXJhbWV0ZXJzLgoKIyMjIEltcG9ydGFuY2Ugb2YgdGhlIE1vZGVsCgpXZSBjb21wYXJlZCB0aGUgc2VsZWN0ZWQgbW9kZWwgdG8gYSBpbnRlcmNlcHQgb25seSBtb2RlbCBieSAkXERlbHRhIEFJQ2MkLiBJdCB3aWxsIHRlbGwgdXMgaG93IG11Y2ggb2YgYW4gaW1wcm92ZW1lbnQgb3VyIG1vZGVsIGlzIG92ZXIgc2ltcGx5IGxvb2tpbmcgYXQgdGhlIG1lYW4uCgojIyBSZXN1bHQKCiMjIyBEYXRhIFZpc3VhbGl6YXRpb24KYGBge3IgZWNobz1GQUxTRX0Kc2V0d2QoIi9Vc2Vycy95aXJhb3poYW5nL0Rlc2t0b3AvQklPTC1wYXBlcjEiKQp2ZWdlPC1yZWFkLmNzdigiVmVnZXRhdGlvbi5jc3YiICkKdmVnZTwtbmEub21pdCh2ZWdlKQpib3hwbG90KHZlZ2UkUmljaG5lc3MsIHhsYWI9IlJpY2huZXNzIiwgbWFpbj0iQm94cGxvdCBvZiBSaWNobmVzcyIpCmJveHBsb3QodmVnZSRSaWNobmVzc352ZWdlJFRpbWUsIHhsYWI9IlRpbWUiLCB5bGFiPSJSaWNobmVzcyIsIG1haW49IkJveHBsb3Qgb2YgUmljaG5lc3MgdnMgVGltZSIpCmJveHBsb3QodmVnZSRSaWNobmVzc352ZWdlJFRyYW5zZWN0LCB4bGFiPSJUcmFuc2VjdCIsIHlsYWI9IlJpY2huZXNzIiwgbWFpbj0iQm94cGxvdCBvZiBSaWNobmVzcyB2cyBUcmFuc2VjdCIpCmBgYApgYGB7ciBlY2hvPUZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdCh2ZWdlLCBhZXMoUmljaG5lc3MsIFRyYW5zZWN0KSkgK2dlb21fcG9pbnQoKStnZ3RpdGxlKCJEb3QgUGxvdCBvZiBSaWNobmVzcyB2cyBUcmFuc2VjdCIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmdncGxvdCh2ZWdlLCBhZXMoUmljaG5lc3MsIFRpbWUpKSArZ2VvbV9wb2ludCgpK2dndGl0bGUoIkRvdCBQbG90IG9mIFJpY2huZXNzIHZzIFRpbWUiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKRnJvbSB0aGUgYm94cGxvdHMsIHRoZSBtZWRpYW4gcmljaG5lc3MgaXMgYXJvdW5kIDEwLCBhbmQgdGhlcmUgaXMgbm8gb3V0bGllci4gQ29uZGl0aW9uYWwgYm94cGxvdHMgb2YgcmljaG5lc3MgdmVyc3VzIHRpbWUgYW5kIHRyYW5zZWN0IHNob3cgdGhhdCB2ZWdldGF0aW9uIHJpY2huZXNzIGRpZmZlcnMgYnkgdGltZSBhbmQgdHJhbnNlY3QuCmBgYHtyIGVjaG89RkFMU0V9CnBhcihtZnJvdz1jKDMsMikpCnBsb3QodmVnZSRST0NLLCB2ZWdlJFJpY2huZXNzLCB4bGFiPSJST0NLIiwgeWxhYj0iUmljaG5lc3MiKQphYmxpbmUobG0oUmljaG5lc3N+Uk9DSywgZGF0YT12ZWdlKSwgY29sPSJibHVlIikKcGxvdCh2ZWdlJExJVFRFUiwgdmVnZSRSaWNobmVzcywgeGxhYj0iTElUVEVSIiwgeWxhYj0iUmljaG5lc3MiKQphYmxpbmUobG0oUmljaG5lc3N+TElUVEVSLCBkYXRhPXZlZ2UpLCBjb2w9ImJsdWUiKQpwbG90KHZlZ2UkQkFSRVNPSUwsIHZlZ2UkUmljaG5lc3MsIHhsYWI9IkJBUkVTT0lMIiwgeWxhYj0iUmljaG5lc3MiKQphYmxpbmUobG0oUmljaG5lc3N+QkFSRVNPSUwsIGRhdGE9dmVnZSksY29sPSJibHVlIikKcGxvdCh2ZWdlJEZhbGxQcmVjLCB2ZWdlJFJpY2huZXNzLCB4bGFiPSJGYWxsUHJlYyIsIHlsYWI9IlJpY2huZXNzIikKYWJsaW5lKGxtKFJpY2huZXNzfkZhbGxQcmVjLGRhdGE9dmVnZSksIGNvbD0iYmx1ZSIpCnBsb3QodmVnZSRTcHJUbWF4LCB2ZWdlJFJpY2huZXNzLCB4bGFiPSJTcHJUbWF4IiwgeWxhYj0iUmljaG5lc3MiKQphYmxpbmUobG0oUmljaG5lc3N+U3ByVG1heCwgZGF0YT12ZWdlKSwgY29sPSJibHVlIikKYGBgClNjYXR0ZXJwbG90cyBzdWdnZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG9idmlvdXMgbGluZWFyIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByaWNobmVzcyBhbmQgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGV4Y2VwdCBmb3IgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUuCgpgYGB7ciBlY2hvPUZBTFNFfQpwYWlycyh2ZWdlKQpgYGAKYGBge3IgZWNobz1GQUxTRX0KY29ycjwtY29yKHZlZ2UsdXNlPSJjb21wbGV0ZS5vYnMiLCBtZXRob2Q9ImtlbmRhbGwiKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKTSA8LWNvcih2ZWdlLHVzZT0iY29tcGxldGUub2JzIiwgbWV0aG9kPSJrZW5kYWxsIikKY29ycnBsb3QoTSwgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0Iixjb2w9YnJld2VyLnBhbChuPTgsIG5hbWU9IlJkWWxCdSIpKQpgYGAKRnJvbSBwYWlycGxvdHMgYW5kIGNvcnJlbGF0aW9uIG1hdHJpeCwgdGhlcmUgYXJlIHdlYWsgbGluZWFyIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMoJFJeMiQgaXMgbGVzcyB0aGFuIDAuNjYwNyksIHN1Z2dlc3RpbmcgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZW0gYXJlIG5vdCBzaWduaWZpY2FudC4gVGhlcmUgaXMgbm8gY29uY2VybiBvZiBjb2xsaW5lYXJpdHkgd2l0aCBpbmNsdWRpbmcgdGhlc2UgdmFyaWFibGVzIGluIGEgbW9kZWwgYXBhcnQgZnJvbSBhZGRpbmcgbW9kZWwgY29tcGxleGl0eS4KCiMjIyBCYWxhbmNlZCBEYXRhCmBgYHtyIGVjaG89RkFMU0V9CmJhcnBsb3QodGFibGUodmVnZSRUaW1lKSwgeGxhYj0iVGltZSIpCmJhcnBsb3QodGFibGUodmVnZSRUcmFuc2VjdCksIHhsYWI9IlRyYW5zZWN0IikKYGBgCkZyb20gdGhlIGJhcnBsb3RzIG9mIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgZGlmZmVyZW50IGdyb3VwcyBmb3IgdGltZSBhbmQgdHJhbnNlY3RzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHNhbXBsaW5nIGlzIHVuYmFsYW5jZWQsIGFuZCB0aGUgdW5iYWxhbmNlIGlzIHByZXNlbnRlZCBzZXJpb3VzbHkgaW4gdGltZSA2LCBzYW1wbGUgeWVhciAxOTg5LCBzaW5jZSB0aGUgZGF0YSBpbmNsdWRlcyBtb3JlIE4vQXMgaW4gdGhhdCB5ZWFyLgoKIyMjIFR3by13YXkgQU5PVkEKYGBge3IgZWNobz1GQUxTRX0KbGlicmFyeShrbml0cikKYW5vdmFfMndheTwtYW92KFJpY2huZXNzfiBUaW1lICsgVHJhbnNlY3QsIGRhdGE9dmVnZSkKYW5vPC1zdW1tYXJ5KGFub3ZhXzJ3YXkpCmFubwpgYGAKClR3by13YXkgYW5hbHlzaXMgb2YgdmFyaWFuY2UgcmVzdWx0IHRhYmxlIHN1Z2dlc3RzIHRoYXQgdHJhbnNlY3QgZWZmZWN0IHN0YXRpc3RpY2FsbHkgZGlmZmVycyBmcm9tIDAuIFdlIGNhbiByZWplY3QgdGhlIE5VTEwgaHlwb3RoZXNpcyBhbmQgY29uZmlybSB0aGF0IGNoYW5naW5nIHRyYW5zZWN0cyBpbXBhY3QgdGhlIHZlZ2V0YXRpb24gcmljaG5lc3MuIEhvd2V2ZXIsIHRoZSBwLXZhbHVlIG9mIFRpbWUgaXMgMC44NjM+PjAuMDUsIHdlIGNhbm5vdCByZWplY3QgdGhlIE5VTEwgaHlwb3RoZXNpcywgdGh1cyB0aW1lIGRvZXMgbm90IGhhdmUgc2lnbmlmaWNhbnQgZWZmZWN0IG9uIHZlZ2V0YXRpb24gcmljaG5lc3MuCgojIyMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24KCldlIGZpdCB0aGUgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHZhcmlhYmxlcyBvZiByb2NrLCBsaXR0ZXIsIGJhcmVzb2lsLCBmYWxsIHByZWNpcGl0YXRpb24gYW5kIG1heGltdW0gc3ByaW5nIHRlbXBlcmF0dXJlLiAKYGBge3IgZWNobz1GQUxTRX0KbGlicmFyeShubG1lKQpsaWJyYXJ5KGNhcikKbGlicmFyeShrbml0cikKbHI8LWdscyhSaWNobmVzc35ST0NLK0xJVFRFUitCQVJFU09JTCtGYWxsUHJlYytTcHJUbWF4LCBtZXRob2Q9IlJFTUwiLGRhdGE9dmVnZSkKcGxvdChscikKaGlzdChyZXNpZChsciksIHhsYWI9IlJlc2lkdWFscyIsIHlsYWI9IkZyZXF1ZW5jeSIpCnFxUGxvdChyZXNpZChscikpCmBgYApUaGUgY29lZmZpY2llbnRzIGFyZSBhcyBmb2xsb3dpbmc6CkludGVyY2VwdDoyMC4wMDA2NDkxMSwgUk9DSzotMC4wOTI2NzU4NiwgTElUVEVSOi0wLjA4MjYzMjk3LCBCQVJFU09JTDotMC4xMzM2NjMxOCwgRmFsbFByZWM6MC4wMTk2NDkxNSAgICAgU3ByVG1heDogLTAuNDA4MjA1NzMuIApUaGVyZSBpcyBubyBvYnZpb3VzIHBhdHRlcm4gb2YgcmVzaWR1YWxzIHZzIGZpdHRlZCB2YWx1ZSwgYW5kIGhpc3RvZ3JhbSBhbmQgUS1RIHBsb3Qgc3VnZ2VzdCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4KVGhlbiB3ZSBhZGQgdGhlIGludGVyYWN0aW9uIHRlcm0gb2YgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUgYW5kIGZhbGwgcHJlY2lwaXRhdGlvbiB0byBvdXIgbGluZWFyIG1vZGVsOgpgYGB7ciBlY2hvPUZBTFNFfQpscjE8LWdscyhSaWNobmVzc35ST0NLK0xJVFRFUitCQVJFU09JTCtGYWxsUHJlYypTcHJUbWF4LCBtZXRob2Q9IlJFTUwiLGRhdGE9dmVnZSkKY288LXN1bW1hcnkobHIpJGNvZWZmaWNpZW50cwpwbG90KGxyMSkKaGlzdChyZXNpZChscjEpLCB4bGFiPSJSZXNpZHVhbHMiLCB5bGFiPSJGcmVxdWVuY3kiKQpxcVBsb3QocmVzaWQobHIxKSkKYW5vdmEobHIsbHIxKQpgYGAKVGhlIGNvZWZmaWNpZW50cyBhcmUgYXMgZm9sbG93aW5nOgpJbnRlcmNlcHQ6IDE3LjUxMTg3NjAwMywgUk9DSzogLTAuMDkzNzcwNzQ5LCBMSVRURVI6LTAuMDg3MzY2MzAzLCBCQVJFU09JTDotMC4xMzUzNDMzOTAsIEZhbGxQcmVjOiAwLjA3NDIyOTk0NSwgU3ByVG1heDotMC4xOTg2Mzc4MDcsIEZhbGxQcmVjOlNwclRtYXg6LTAuMDA0NDM4ODU3LgpUaGUgcmVzaWR1YWwgcGxvdCBkb2VzIG5vdCBzaG93IHBhdHRlcm5zIGFuZCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4gQ29tcGFyaW5nIHRoZSBBSUMgb2YgdGhlIHR3byBmaXhlZCBtb2RlbCwgd2UgZm91bmQgdGhhdCBsciBtb2RlbCB3aXRoIEFJQz0yNzguNzA1NywgaXMgYmV0dGVyIHRoYW4gbHIxIG1vZGVsIHdpdGggQUlDPTI4OC42OTk0LiBsaWtlbGlob29kIHJhdGlvIHRlc3QoTFI9Ny45OTM2NzEsIHAtdmFsdWU9MC4wMDQ3KSBhbHNvIGNvbmZpcm1zIHRoZSBjb25jbHVzaW9uLgpJbiBvcmRlciB0byBmaW5kIG91dCB3aGV0aGVyIHRpbWUgaGFzIGVmZmVjdCBvbiBvdXIgbGluZWFyIG1vZGVsLCB3ZSBwbG90IHJlc2lkdWFscyB2cyB0aW1lOgpgYGB7ciBlY2hvPUZBTFNFfQpzY2F0dGVyLnNtb290aCh2ZWdlJFNBTVBMRVlSLCByZXNpZChsciksIHhsYWI9IlRpbWUiLCB5bGFiPSJSZXNpZHVhbHMiKQpgYGAKQSBMT0VTUyBzbW9vdGhlciB3aXRoIGEgc3BhbiBvZiAwLjc1IGFkZGVkIHRvIHRoZSBkaWFncmFtIGlzIGFsbW9zdCBhIHN0cmFpZ2h0IGxpbmUgYXQgemVybyBpbmRpY2F0aW5nIHRoYXQgdGltZSBpcyBub3QgaW1wb3J0YW50IGluIHRoZSBsaW5lYXIgcmVncmVzc2lvbiwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIEFOT1ZBIGNvbmNsdXNpb24uCgojIyMgTGluZWFyIE1peGVkIEVmZmVjdHMgTW9kZWwKClRoZSB2YXJpYWJsZSBhc3N1bWVkIHRvIGhhdmUgcmFuZG9tIGVmZmVjdHMgaXMgVHJhbnNlY3QuIG1vZDEgaXMgdGhlIHJhbmRvbSBpbnRlcmNlcHQgbW9kZWwsIGFuZCBtb2QyIGlzIHRoZSByYW5kb20gaW50ZXJjZXB0IGFuZCBzbG9wZSBtb2RlbC4KUmFuZG9tIGludGVyY2VwdCBtb2RlbChtb2QxKToKYGBge3IgZWNobz1GQUxTRX0KI1JhbmRvbSBJbnRlcmNlcHQKbGlicmFyeShubG1lKQptb2QxPC1sbWUoUmljaG5lc3N+Uk9DSytMSVRURVIrQkFSRVNPSUwrRmFsbFByZWMrU3ByVG1heCwgcmFuZG9tPSB+MXxUcmFuc2VjdCxtZXRob2Q9IlJFTUwiLGRhdGE9dmVnZSkKc3VtbWFyeShtb2QxKQpwbG90KGZpdHRlZChtb2QxKSwgcmVzaWQobW9kMSkpCmhpc3QocmVzaWQobW9kMSkpCnFxUGxvdChyZXNpZChtb2QxKSkKYGBgClJhbmRvbSBpbnRlcmNlcHQgYW5kIHNsb3BlIG1vZGVsKG1vZDIpOgpgYGB7ciBlY2hvPUZBTFNFfQptb2QyPC1sbWUoUmljaG5lc3N+Uk9DSytMSVRURVIrQkFSRVNPSUwrRmFsbFByZWMrU3ByVG1heCwgcmFuZG9tPSB+MStGYWxsUHJlY3xUcmFuc2VjdCxtZXRob2QgPSAiUkVNTCIsZGF0YT12ZWdlKQpzdW1tYXJ5KG1vZDIpCnBsb3QoZml0dGVkKG1vZDIpLCByZXNpZChtb2QyKSkKaGlzdChyZXNpZChtb2QyKSkKcXFQbG90KHJlc2lkKG1vZDIpKQphbm92YShtb2QxLCBtb2QyKQpgYGAKUmVzaWR1YWxzIG9mIGJvdGggbW9kMSBhbmQgbW9kMiBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIGJ1dCBBSUMgb2YgbW9kMSBpcyBsb3dlciB0aGFuIEFJQyBvZiBtb2QyKDI4MC43MDU3PDI4NC43MDU3KSwgc3VnZ2VzdGluZyBtb2QxIGlzIGJldHRlciB0aGFuIG1vZDIuCgojIyMgSWRlbnRpZnkgdGhlIGZpeGVkIGVmZmVjdHMgc3RydWN0dXJlCgojIyMjIE1vZGVsIHNlbGVjdGlvbiBieSBsaWtlbGlob29kIHJhdGlvIHRlc3Q6CgpCeSBjaGVja2luZyB0aGUgQUlDLCBsciBpcyBiZXR0ZXIgdGhhbiBtb2QxLiBCYXNlZCBvbiBwLXZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycywgTElUVEVSIG1pZ2h0IGJlIHdvcnRoIGRyb3BwaW5nLgpgYGB7ciBlY2hvPUZBTFNFfQphbm92YShscixtb2QxKQpzdW1tYXJ5KGxyKQpgYGAKU3RlcDE6IERyb3BwaW5nIExJVFRFUgpgYGB7ciBlY2hvPUZBTFNFfQpyZWZpdDE8LXVwZGF0ZShsciwufi4tTElUVEVSKQpzdW1tYXJ5KHJlZml0MSkKYW5vdmEocmVmaXQxLCBscikKYGBgCldlIGNvbXBhcmVkIHRoZSB0d28gbW9kZWwobHIgYW5kIHJlZml0MSkgdmlhIEFOT1ZBLCBhbmQgdGhlIEFJQyByZXN1bHQgc3VnZ2VzdHMgdGhhdCByZWZpdDEgaXMgYmV0dGVyIHRoYW4gbHIsIHNpbmNlIEFJQyBvZiByZWZpdDEgaXMgMjc2LjA0OTksIGFuZCBBSUMgb2YgbHIgaXMgMjc4LjcwNTcsIGJ1dCB0aGUgbGlrZWxpaG9vZCByYXRpbyBvZiByZWZpdDEgdnMgbHIgaXMgMC42NTU4MTE0LCB3aXRoIHAtdmFsdWU9MC40MTg8MC4wNSwgaW5kaWNhdGluZyB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlLiBMb29raW5nIGF0IHAtdmFsdWVzIG9mIHBhcmFtZXRlcnMgaW4gcmVmaXQxLCB0aGUgbmV4dCB0ZXJtIG1pZ2h0IGJlIHdvcnRoIGRyb3BwaW5nIGlzIEZhbGxQcmVjLgpTdGVwMjogRHJvcHBpbmcgRmFsbFByZWMKYGBge3IgZWNobz1GQUxTRX0KcmVmaXQyPC11cGRhdGUocmVmaXQxLC5+Li1GYWxsUHJlYykKc3VtbWFyeShyZWZpdDIpCmFub3ZhKHJlZml0MSxyZWZpdDIpCmBgYApUaGUgQUlDIHJlc3VsdCBzdWdnZXN0cyByZWZpdDIgbW9kZWwoQUlDPTI3Ni4wNDk5KSBpcyBiZXR0ZXIgdGhhbiByZWZpdDEoMjczLjMzOTEpLCBidXQgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBpbmRpY2F0ZXMgd2UgY2Fubm90IHJlamVjdCB0aGUgTlVMTCBoeXBvdGhlc2lzIGFuZCB0aGUgdHdvIG1vZGVscyBkbyBub3QgZGlmZmVyIHNpZ25pZmljYW50bHkuCiMjIyMgTW9kZWwgc2VsZWN0aW9uIGJ5IEFJQ2M6CmBgYHtyIGVjaG89RkFMU0V9CmxpYnJhcnkoTXVNSW4pCmRyZWRnZShscikKYGBgCkFJQ2MgYmFzZWQgbW9kZWwgc2VsZWN0aW9uIHBlcmZvcm1lZCBieSAqKmRyZWRnZSgpKiogZnVuY3Rpb24gZmF2b3JzIHRoZSBmaXhlZCBsaW5lYXIgbW9kZWwgd2l0aCBleHBsYW5hdG9yeSB2YXJpYWxlcyBvZiBCQVJFU09JTCwgUk9DSywgU3ByVG1heC4KVGhlbiB3ZSBwZXJmb3JtZWQgYSBmaW5hbCByb3VuZCBvZiBkaWFnbm9zdGljIGNoZWNrcyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBpc3N1ZXMgYnkgcGxvdHRpbmcgdGhlIHJlc2lkdWFscyBhbmQgY2FsY3VsYXRpbmcgdGhlIGNvcnJlbGF0aW9ucy4KYGBge3IgZWNobz1GQUxTRX0KcGxvdChmaXR0ZWQocmVmaXQyKSwgcmVzaWQocmVmaXQyKSkKaGlzdChyZXNpZChyZWZpdDIpLCBicmVha3M9IDEwLCB4bGFiPSJSZXNpZHVhbHMiLCB5bGFiPSJGcmVxdWVuY3kiKQpxcVBsb3QocmVzaWQocmVmaXQyKSkKI2NvcnJlbGF0aW9uCnN1bW1hcnkocmVmaXQyKQpgYGAKVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gaW50ZXJjZXB0IGFuZCBTcHJUbWF4IGlzIGhpZ2guIFRoZSBzb2x1dGlvbiBpcyBtZWFuIGNlbnRlcmluZyB0aGUgdmFyaWFibGVzOgpgYGB7ciBlY2hvPUZBTFNFfQojc29sdXRpb246IG1lYW4gY2VudGVyaW5nIHJlZmVyZW5jZQpTVDwtc2NhbGUodmVnZSRTcHJUbWF4KQpSQzwtc2NhbGUodmVnZSRST0NLKQpCUzwtc2NhbGUodmVnZSRCQVJFU09JTCkKcmVmaXQzPC1nbHMoUmljaG5lc3N+UkMrQlMrU1QsbWV0aG9kID0gIk1MIixkYXRhPXZlZ2UpCnN1bW1hcnkocmVmaXQzKQpgYGAKIyMjIE1vZGVsIEF2ZXJhZ2UKPCEtLSBXZSBzZWxlY3RlZCB0aGUgbW9kZWwgdGhlICRcRGVsdGEkQUlDYyBvZiAyIG9mIHRoZSB0b3AgbW9kZWwuIC0tPgpgYGB7ciBlY2hvPUZBTFNFfQojU3Vic2V0IGFsbCBtb2RlbHMgd2l0aGluICRcRGVsdGEkQUlDYyBvZiAyIG9mIHRoZSB0b3AgbW9kZWwKc3Vic2V0PC1zdWJzZXQoZHJlZGdlKGxyKSxzdWJzZXQgPSBkZWx0YTwyKQpzdWJzZXQKI2VzdGltYXRlIHBhcmFtZXRlcnMKY29uZmludChyZWZpdDMsIGxldmVsPTAuOTUpCmBgYApUaGVyZSBpcyBvbmx5IHRoZSB0b3AgbW9kZWwgbGVmdC4gOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgZXN0aW1hdGUgcGFyYW1ldGVycyBpczoKSW50ZXJjZXB0OiAoOS40MTQsIDEwLjUxNyksIFJvY2s6ICgtMS41MzMsIC0wLjQyMCksIEJhcmVzb2lsOiAoLTEuNzczLCAtMC41NTApLCBTcHJUbWF4OigtMS44MzUsIC0wLjYxNCkKCiMjIyBJbXBvcnRhbmNlIG9mIHRoZSBNb2RlbAoKV2UgcmVmaXR0ZWQgdGhlIGRhdGEgd2l0aCBhbiBpbnRlcmNlcHQgb25seSBtb2RlbChyZWZpdDQpLiBUaGUgYW5vdmEgdGFibGUgb2YgdGhlIHNlbGVjdGVkIG1vZGVscyhyZWZpdDIsIGxyKSBhbmQgcmVmaXR0aW5nIG1vZGVsKHJlZml0NCkgaXMgc2hvd24gYmVsb3c6CmBgYHtyIGVjaG89RkFMU0V9CnJlZml0NDwtZ2xzKFJpY2huZXNzfjEsbWV0aG9kPSJSRU1MIixkYXRhPXZlZ2UpCmFub3ZhKHJlZml0MixyZWZpdDQpCmFub3ZhKGxyLCByZWZpdDQpCmBgYApUaGUgQUlDIGRlY3JlYXNlZCBieSAyNCBhbmQgMTguNjM1LCBhbmQgbGlrZWxpaG9vZCByYXRpbyBpcyAzMChwLXZhbHVlPDAuMDAwMSkgYW5kIDI4LjYzIHJlc3BlY3RpdmVseS4gT3VyIG1vZGVscyBzaWduaWZpY2FudGx5IGltcHJvdmVzIHRoZSBwcmVkaWN0aW9uIGNvbXBhcmluZyB0byB0aGUgbWVhbi4KCiMjIERpc2N1c3Npb24KClZlZ2V0YXRpb24gcmljaG5lc3MgaXMgYSBtZWFzdXJlbWVudCBvZiBiaW9kaXZlcnNpdHkgaW4gYSBwbGFudCBjb21tdW5pdHkuIEVudmlyb25tZW50YWwgY2hhbmdlcyBzdWNoIGFzIGNsaW1hdGUgdmFyaWF0aW9uLCBiYXJlc29pbCBjaGFuZ2VzLCBzb2lsIHRleHR1cmUgYW5kIHJvY2sgY29tcG9zaXRpb24gb3ZlciB0aW1lIGFsbCByZWxhdGUgdG8gdmVnZXRhdGlvbiByaWNobmVzcy4gVGhlIHRyYW5zZWN0cyBhcmUgbG9jYXRlZCBpbiBkaWZmZXJlbnQgc3R1ZHkgYXJlYXM6IFllbGxvd3N0b25lIE5hdGlvbmFsIFBhcmsgYW5kIE5hdGlvbmFsIEJpc29uIFJhbmdlLiBUaGUgWU5QIHRyYW5zZWN0cyBhcmUgbG9jYXRlZCB3aXRoaW4gbG93ZXIgdGVyaWFyeSBpZ25lb3VzIGFuZCBtZXRhbW9ycGhpYyByb2NrcyBhbmQgdHJhbnNlY3RzIGluIE5CUiBhcmUgd2l0aGluIGZpbmUtZ3JhaW5lZCBxdWFydHppdHIsIGFyZ2lsbGl0ZSwgYmFuZGVkIHNsYXRlLCBhbmQgaW50ZXItYmVkZGVkIHNhbmRzdG9uZS4gVGhlIHNvaWwgdGV4dHVyZSwgcm9jayBhbmQgbGl0dGVyIGRpZmZlciBmcm9tIGVhY2ggdHJhbnNlY3QsIHJlc3VsdGluZyBpbiBkaWZmZXJlbnQgd2F0ZXIgcmV0ZW50aW9uIGFuZCBzdXJmYWNlIHRlbXBlcmF0dXJlLiAKCkluIG91ciBzdHVkeSwgd2UgaW52ZXN0aWdhdGVkIGVmZmVjdHMgb2YgZml2ZSB2YXJpYWJsZXM6IHJvY2ssIGxpdHRlciwgYmFyZXNvaWwsIG1heGltdW0gc3ByaW5nIHRlbXBlcmF0dXJlLCBhbmQgZmFsbCBwcmVjaXBpdGF0aW9uLiBXZSBmaXR0ZWQgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0byB0aGUgZGF0YSB1c2luZyB0aGUgYWJvdmUgdmFyaWFibGVzLlRoZSBjb2VmZmljaWVudHMgc3VnZ2VzdCB0aGF0IHZlZ2V0YXRpb24gcmljaG5lc3MgaXMgbmVnYXRpdmVseSByZWxhdGVkIHRvIGxpdHRlcigtMC4wODI2KSwgcm9jaygtMC4wOTI3KSwgYmFyZXNvaWwoLTAuMTMzNykgYW5kIG1heGltdW0gc3ByaW5nIHRlbXBlcmF0dXJlKC0wLjQwODIpLCBidXQgaXQgaXMgcG9zaXRpdmVseSByZWxhdGVkIHRvIGZhbGwgcHJlY2lwaXRhdGlvbigwLjAxOTYpLiBBbHRob3VnaCB0aW1lIHNob3VsZCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGluIGNvbW11bml0eSBjaGFuZ2VzLCBpdCBoYXMgbGl0dGxlIGVmZmVjdCBvbiB0aGUgbGluZWFyIG1vZGVsIHNpbmNlIG9uIHRoZSByZXNpZHVhbHMgdnMgdGltZSBwbG90LCBhIExPRVNTIHNtb290aGVyIGFkZGVkIHdhcyBhbG1vc3QgYSBzdHJhaWdodCBsaW5lIGF0IHplcm8sIGluZGljYXRpbmcgdGltZSBpcyBub3QgYSBjb25jZXJuIGluIHRoZSByZWdyZXNzaW9uIG1vZGVsLgoKRnJvbSBwcmV2aW91cyBzdHVkaWVzLCB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIgYW5kIGhhdmUgZWZmZWN0IG9uIHRoZSBwcm9kdWN0aXZpdHkgYW5kIGJpb2RpdmVyc2l0eSBvZiBhbiBlY29zeXN0ZW0uIFdlIGFkZGVkIGFuIGludGVyYWN0aW9uIHRlcm0gb2YgZmFsbCBwcmVjaXBpdGF0aW9uIGFuZCBtYXhpbXVtIHNwcmluZyB0ZW1wZXJhdHVyZSB0byBvdXIgbW9kZWwuIFRoZSBBSUMgb2YgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiBpcyAyODguNjk5NCwgd2hpY2ggaXMgaGlnaGVyIHRoYW4gQUlDIG9mIG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24oMjc4LjcwNTcpLiBUaGUgbGlrZWxpaG9vZCByYXRpbyBpcyA3Ljk5MzcsIHAtdmFsdWUgaXMgMC4wMDQ3LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZXh0cmEgaW50ZXJhY3Rpb24gcGFyYW1ldGVyIGRpZCBub3QgcmVzdWx0IGluIGFuIGltcHJvdmVtZW50IHRvIHRoZSBtb2RlbCwgYnV0IGFkZGVkIGV4dHJhIGNvbXBsZXhpdHkuCgpMaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbCBpcyBhIHN0YXRpc3RpY2FsIG1vZGVsIGNvbnRhaW5pbmcgYm90aCBmaXhlZCBlZmZlY3RzIGFuZCByYW5kb20gZWZmZWN0cy4gVGhlIGFzc3VtcHRpb24gYmVoaW5kIHRoZSBtb2RlbCBpcyB0aGF0IHRoZSBlZmZlY3Qgb2YgdGhlIHZhcmlhYmxlIG9jY3VycmluZyBpbiBuZXN0cyB2YXJpZXMgcmFuZG9tbHkuIFVzdWFsbHkgdGhlIG1peGVkIG1vZGVsIGV4cGxhaW5zIHRoZSB2YXJpYXRpb24gb2YgZXJyb3JzIGJldHRlciB0aGFuIG1vZGVscyBvbmx5IHdpdGggZml4ZWQgZWZmZWN0cy4gV2UgcmVmaXR0ZWQgdGhlIG1vZGVsIHdpdGggYSByYW5kb20gaW50ZXJjZXB0IGFyb3VuZCBkYXRhIGZyb20gdGhlIHNhbWUgdHJhbnNlY3QsIGFuZCB3aXRoIGEgcmFuZG9tIGludGVyY2VwdCBhbmQgc2xvcGUuIEhvd2V2ZXIsIGNvbXBhcmluZyB0aGUgdGhyZWUgbW9kZWxzLCBBSUMgb2YgdGhlIGZpeGVkIG1vZGVsIGlzIHRoZSBsb3dlc3QuIAoKSW4gdGhlIGZpeGVkIGVmZmVjdHMgc2VsZWN0aW9uIHByb2Nlc3MsIHdlIGZpcnN0IGxvb2tlZCBhdCB0aGUgcC12YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGZ1bGwgZml4ZWQgZWZmZWN0cyBtb2RlbC4gVGhlIHBhcmFtZXRlciBvZiBsaXR0ZXIgaGFzIHRoZSBoaWdoZXN0IHAtdmFsdWUoMC4wNTIzKSBtaWdodCBiZSB3b3J0aCBkcm9wcGluZy4gVGhlIHJlZHVjZWQgbW9kZWwgd2l0aG91dCBsaXR0ZXIgaGFzIEFJQyB2YWx1ZSBvZiAyNzYuMDQ5OSwgbG93ZXIgdGhhbiBBSUMgb2YgdGhlIGZ1bGwgbW9kZWwoMjc4LjcwNTcpLiBIb3dldmVyLCB0aGUgbGlrZWxpaG9vZCByYXRpbyBpcyAwLjY1NTgsIHdpdGggcC12YWx1ZSBvZiAwLjQxOCwgc3VnZ2VzdGluZyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG1vZGVscy4gVGhlbiBieSBjaGVja2luZyB0aGUgcC12YWx1ZXMgb2YgdGhlIHJlZml0dGVkIG1vZGVsLCB0aGUgZmFsbCBwcmVjaXBpdGF0aW9uIHRlcm0gd2l0aCBoaWdoZXN0IHAtdmFsdWUoMC4wMDc3KSBtaWdodCBiZSB3b3J0aCBkcm9wcGluZy4gVGhlIHJlZHVjZWQgbW9kZWwgd2l0aG91dCBsaXR0ZXIgYW5kIHByZWNpcGl0YXRpb24gaGFzIEFJQyB2YWx1ZSBvZiAyNzMuMzM5MSwgd2hpY2ggaXMgbG93ZXIgdGhlbiB0aGUgcHJldmlvdXMgcmVkdWNlZCBtb2RlbCwgYnV0IHRoZSBsaWtlbGlob29kIHJhdGlvIHAtdmFsdWUgaXMgMC4zOTkyIHN1Z2dlc3Rpbmcgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4gTGlrZWxpaG9vZCByYXRpbyB0ZXN0cyBib3RoIGluZGljYXRlIHRoZSB0ZXJtcyBkbyBub3QgbmVlZCB0byBiZSByZW1vdmVkLiBUaGUgKipkcmVkZ2UoKSoqIGZ1bmN0aW9uIHNob3dzIHRoYXQgdGhlIGNsZWFyIHdpbm5lciBpcyBhIGZpeGVkIGxpbmVhciBtb2RlbCB3aXRoIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBvZiBCQVJFU09JTCwgUk9DSywgU3ByVG1heC4gCgpJbiB0aGUgbW9kZWwgdmFsaWRhdGlvbiBwcm9jZXNzLCB3ZSBwbG90dGVkIHRoZSByZXNpZHVhbHMgYW5kIHRoZXJlIGlzIG5vIG9idmlvdXMgcGF0dGVybiBiZXR3ZWVuIGZpdHRlZCB2YWx1ZXMgdnMgcmVzaWR1YWxzLiBUaGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBmcm9tIHRoZSBoaXN0b2dyYW1zIGFuZCBRLVEgcGxvdC4gSG93ZXZlciwgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gaW50ZXJjZXB0IGFuZCBTcHJUbWF4IGlzIGhpZ2guIFdlIHNvbHZlZCB0aGlzIHByb2JsZW0gYnkgbWVhbiBjZW50ZXJpbmcgdGhlIHZhcmlhYmxlcy4gCgpXZSBzZWxlY3RlZCBhbmQgYXZlcmFnZWQgdGhlIG1vZGVscywgYnkgc3Vic2V0dGluZyBhbGwgbW9kZWxzIHdpdGhpbiAkXERlbHRhJEFJQ2Mgb2YgMiBvZiB0aGUgdG9wIG1vZGVsLlRoZXJlIGlzIG9ubHkgdGhlIHRvcCBtb2RlbChyZWZpdDIpbGVmdC4gVGhlbiB3ZSByZWZpdHRlZCB0aGUgZGF0YSB3aXRoIGFuIGludGVyY2VwdCBvbmx5IG1vZGVsKHJlZml0NCkuIEJ5IGluY2x1ZGluZyB0aGUgZmFjdG9ycyBvZiBiYXJlc29pbCwgcm9jaywgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUsIHRoZSBBSUMgZGVjcmVhc2VkIGJ5IDI0LCBhbmQgbGlrZWxpaG9vZCByYXRpbyBpcyAzMChwLXZhbHVlPDAuMDAwMSkuIEJ5IGluY2x1ZGluZyB0aGUgYWxsIHRoZSBmYWN0b3JzLCB0aGUgQUlDIGRlY3JlYXNlZCBieSAxOC42MzUsIGFuZCBsaWtlbGlob29kIHJhdGlvIGlzIDI4LjYzKHAtdmFsdWU8MC4wMDAxKS4gT3VyIG1vZGVsIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgdGhlIHByZWRpY3Rpb24gY29tcGFyaW5nIHRvIHRoZSBtZWFuLgoKVHdvIGRpZmZlcmVudCBtb2RlbCBzZWxlY3Rpb24gYXBwcm9hY2hlczogTGlrZWxpaG9vZCByYXRpbyB0ZXN0IGFuZCBBSUMgcHJvdmlkZSB0d28gZGlmZmVyZW50IG1vZGVsczogCjEuIGEgZml4ZWQgbW9kZWwgb2YgZnVsbCBmYWN0b3JzOiBiYXJlc29pbCwgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUsIGZhbGwgcHJlY2lwaXRhdGlvbiwgcm9jayBhbmQgbGl0dGVyCjIuIGEgZml4ZWQgbW9kZWwgd2l0aCByZWR1Y2VkIGZhY3RvcnM6IGJhcmVzb2lsLCBtYXhpbXVtIHNwcmluZyB0ZW1wZXJhdHVyZSwgcm9jay4KVGhleSBib3RoIGltcHJvdmUgdGhlIG1vZGVsIHByZWRpY3Rpb24gY29tcGFyZWQgdG8gdGhlIG1lYW4uIEhvd2V2ZXIsIGZhbGwgcHJlY2lwaXRhdGlvbiBpcyB2aXRhbCB0byByZWNoYXJnaW5nIHNvaWwgbW9pc3R1cmUgZm9yIHBsYW50IGdyb3d0aCB0byBiZWdpbiBpbiBzcHJpbmc7IFRoZSBhbW91bnQgb2YgbGl0dGVyIGFmZmVjdCBtb2lzdHVyZSByZXRlbnRpb24sIHN1cmZhY2UgdGVtcGVyYXR1cmUsIGFuZCBudXRyaWVudHMgYXZhaWxhYmxlLiBBbHRob3VnaCBBSUMgbWV0aG9kIGZhdm9ycyB0aGUgcmVkdWNlZCBtb2RlbCwgd2UgcmVjb21tZW5kIHRoZSBmdWxsIG1vZGVsIHdpdGggYWxsIHRoZSB2YXJpYWJsZXMgaW4gYSBiaW9sb2dpY2FsIGNvbnRleHQ6IGJpb2RpdmVyc2l0eSBtZWFzdXJlZCBieSB2ZWdldGF0aW9uIHJpY2huZXNzLCBpcyBuZWdhdGl2ZWx5IHJlbGF0ZWQgdG8gbGl0dGVyLCByb2NrLCBiYXJlc29pbCBhbmQgbWF4aW11bSBzcHJpbmcgdGVtcGVyYXR1cmUsIGFuZCBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gZmFsbCBwcmVjaXBpdGF0aW9uLiBIaWdoZXN0IGNvZWZmaWNpZW50IG9mIG1heGltdW0gc3ByaW5nIHRlbXBlcmF0dXJlKC0wLjQwODIpIGluZGljYXRlcyBncmVhdGVyIHJlbGV2YW5jZSBvZiB2ZWdldGF0aW9uIHJpY2huZXNzLiBMb3dlciBjb2VmZmljaWVudHMgb2YgZmFsbCBwcmVjaXBpdGF0aW9uIGFuZCBsaXR0ZXIsIGluZGljYXRlIGxlc3MgcmVsZXZhbmNlIGFuZCBtaWdodCBiZSBkcm9wcGVkLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggQUlDIG1vZGVsIHNlbGVjdGlvbiByZXN1bHQuCgojIyBSZWZlcmVuY2UKClsxXSBSb2JlcnRzLCBGLiBTLiAoMjAxOSkuIE1lYXN1cmVtZW50IG9mIGJpb2RpdmVyc2l0eTogUmljaG5lc3MgYW5kIGV2ZW5uZXNzLiBJbiBNYXRoZW1hdGljcyBvZiBQbGFuZXQgRWFydGggKHBwLiAyMDMtMjI0KS4gU3ByaW5nZXIsIENoYW0uPGJyPgpbMl0gV29vZHdhcmQsIEEuLCBTbWl0aCwgSy4gUi4sIENhbXBiZWxsLUxlbmRydW0sIEQuLCBDaGFkZWUsIEQuIEQuLCBIb25kYSwgWS4sIExpdSwgUS4sIC4uLiAmIEhhaW5lcywgQS4gKDIwMTQpLiBDbGltYXRlIGNoYW5nZSBhbmQgaGVhbHRoOiBvbiB0aGUgbGF0ZXN0IElQQ0MgcmVwb3J0LiBUaGUgTGFuY2V0LCAzODMoOTkyNCksIDExODUtMTE4OS48YnI+ClszXSBHaWxsbWFuLCBMLiBOLiwgJiBXcmlnaHQsIFMuIEQuICgyMDE0KS4gU3BlY2llcyByaWNobmVzcyBhbmQgZXZvbHV0aW9uYXJ5IHNwZWVkOiB0aGUgaW5mbHVlbmNlIG9mIHRlbXBlcmF0dXJlLCB3YXRlciBhbmQgYXJlYS4gSm91cm5hbCBvZiBCaW9nZW9ncmFwaHksIDQxKDEpLCAzOS01MS48YnI+Cls0XSBMaSwgTC4sIFpoZW5nLCBaLiwgQmllZGVybWFuLCBKLiBBLiwgWHUsIEMuLCBYdSwgWi4sIENoZSwgUi4sIC4uLiAmIEhhbywgWS4gKDIwMTkpLiBFY29sb2dpY2FsIHJlc3BvbnNlcyB0byBoZWF2eSByYWluZmFsbCBkZXBlbmQgb24gc2Vhc29uYWwgdGltaW5nIGFuZCBtdWx0aeKAkHllYXIgcmVjdXJyZW5jZS4gTmV3IFBoeXRvbG9naXN0LCAyMjMoMiksIDY0Ny02NjAuPGJyPgpbNV0gU29jaGVyLCBTLiBBLiwgUHJhdGksIEQuLCBCb2NoLCBTLiwgTcO8bGxlciwgSi4sIEtsYXVzLCBWLiBILiwgSMO2bHplbCwgTi4sICYgRmlzY2hlciwgTS4gKDIwMTIpLiBEaXJlY3QgYW5kIHByb2R1Y3Rpdml0eeKAkG1lZGlhdGVkIGluZGlyZWN0IGVmZmVjdHMgb2YgZmVydGlsaXphdGlvbiwgbW93aW5nIGFuZCBncmF6aW5nIG9uIGdyYXNzbGFuZCBzcGVjaWVzIHJpY2huZXNzLiBKb3VybmFsIG9mIEVjb2xvZ3ksIDEwMCg2KSwgMTM5MS0xMzk5Ljxicj4KWzZdWzddWzE0XSBTaWtraW5rLCBQLiBHLiwgWnV1ciwgQS4gRi4sIEllbm8sIEUuIE4uLCAmIFNtaXRoLCBHLiBNLiAoMjAwNykuIE1vbml0b3JpbmcgZm9yIGNoYW5nZTogdXNpbmcgZ2VuZXJhbGlzZWQgbGVhc3Qgc3F1YXJlcywgbm9uLW1ldHJpYyBtdWx0aWRpbWVuc2lvbmFsIHNjYWxpbmcsIGFuZCB0aGUgTWFudGVsIHRlc3Qgb24gd2VzdGVybiBNb250YW5hIGdyYXNzbGFuZHMuIEluIEFuYWx5c2luZyBlY29sb2dpY2FsIGRhdGEgKHBwLiA0NjMtNDg0KS4gU3ByaW5nZXIsIE5ldyBZb3JrLCBOWTxicj4KWzhdIEJ1dHRyZXksIFMuLCAmIFdoaXRha2VyLCBMLiBSLiAoMjAxNykuIEEgRGF0YSBTY2llbnRpc3QncyBHdWlkZSB0byBBY3F1aXJpbmcsIENsZWFuaW5nIGFuZCBNYW5hZ2luZyBEYXRhIGluIFIuIFdpbGV5Ljxicj4KWzldIFp1dXIsIEEuLCBJZW5vLCBFLiBOLiwgJiBTbWl0aCwgRy4gTS4gKDIwMDcpLiBBbmFseXppbmcgZWNvbG9naWNhbCBkYXRhLiBTcHJpbmdlci48YnI+ClsxMF0gV2lsa2luc29uLCBMLiAoMTk5OSkuIERvdCBwbG90cy4gVGhlIEFtZXJpY2FuIFN0YXRpc3RpY2lhbiwgNTMoMyksIDI3Ni0yODEuPGJyPgpbMTFdIEFkbGVyLCBQLiBCLiwgJiBMZXZpbmUsIEouIE0uICgyMDA3KS4gQ29udHJhc3RpbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHByZWNpcGl0YXRpb24gYW5kIHNwZWNpZXMgcmljaG5lc3MgaW4gc3BhY2UgYW5kIHRpbWUuIE9pa29zLCAxMTYoMiksIDIyMS0yMzIuPGJyPgpbMTJdIEFpdGtpbiwgQS4gQy4gKDE5MzUpLiBPbiBsZWFzdCBzcXVhcmVzIGFuZCBsaW5lYXIgY29tYmluYXRpb24gb2Ygb2JzZXJ2YXRpb25zLiBQcm9jZWVkaW5ncyBvZiB0aGUgUm95YWwgU29jaWV0eSBvZiBFZGluYnVyZ2gsIDU1LCA0Mi00OC48YnI+ClsxM10gVm9sZW5lYywgWi4gTS4sICYgQmVsb3Zza3ksIEcuIEUuICgyMDE4KS4gVGhlIGludGVyYWN0aW9uIG9mIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uIGRldGVybWluZXMgcHJvZHVjdGl2aXR5IGFuZCBkaXZlcnNpdHkgaW4gYSBidW5jaGdyYXNzIHByYWlyaWUgZWNvc3lzdGVtLiBPZWNvbG9naWEsIDE4OCgzKSwgOTEzLTkyMC48YnI+ClsxNV0gTGksIFQuLCBNZW5nLCBRLiwgJiBEdSwgUS4gKDIwMjApLiBBcHBsaWNhdGlvbiBvZiBSYW5kb20gRWZmZWN0cyB0byBFeHBsb3JlIHRoZSBHdWxmIG9mIE1leGljbyBDb2FzdGFsIEZvcmVzdCBEeW5hbWljcyBpbiBSZWxhdGlvbiB0byBNZXRlb3JvbG9naWNhbCBGYWN0b3JzLiBJRUVFIEpvdXJuYWwgb2YgU2VsZWN0ZWQgVG9waWNzIGluIEFwcGxpZWQgRWFydGggT2JzZXJ2YXRpb25zIGFuZCBSZW1vdGUgU2Vuc2luZywgMTMsIDU1MjYtNTUzNS48YnI+ClsxNl0gSWFjb2J1Y2NpLCBELiwgU2NobmVpZGVyLCBNLiBKLiwgUG9wb3ZpY2gsIEQuIEwuLCAmIEJha2FtaXRzb3MsIEcuIEEuICgyMDE2KS4gTWVhbiBjZW50ZXJpbmcgaGVscHMgYWxsZXZpYXRlIOKAnG1pY3Jv4oCdIGJ1dCBub3Qg4oCcbWFjcm/igJ0gbXVsdGljb2xsaW5lYXJpdHkuIEJlaGF2aW9yIHJlc2VhcmNoIG1ldGhvZHMsIDQ4KDQpLCAxMzA4LTEzMTcuCg==